応用情報技術者 2017年 秋期 午後 問04
WebAPIの設計に関する次の記述を読んで、設問1~4に答えよ。
S社は、家庭向けの体重計、血圧計、活動量計などの健康機器を製造販売している会社である。競合する他社との差別化を図るために、クラウドサービスを使った健康管理サービス(以下、本サービスという)の提供を検討している。例えば、健康機器で計測したデータ(以下、計測データという)を本サービスで管理して、スマートフォン(以下、スマホという)のアプリケーションプログラム(以下、アプリという)で計測データを確認できるようにすることを考えている。開発部のT君を中心に、本サービスを設計することになった。
T君は、本サービスのアーキテクチャを検討し、クラウドサービス上に健康機器やアプリから呼ばれるWebAPIを用意し、そのWebAPIを介して、計測データのアップロードや確認を行う方式を採用することにした。
〔本サービスの概要〕
T君は、本サービスの全体を図1のように構成し、前提を次のように考えた。

・健康機器は、表示用のディスプレイ、インターネットにアクセスするための無線LAN(以下、Wi-Fiという)、スマホと通信するためのBluetooth機能を装備する。
・家庭内はWi-Fiルータでインターネットにアクセスできる環境とする。
・計測時には、健康機器はスマホを介することなく、Wi-Fi経由で本サービスにアクセスする。
〔本サービスのユースケース〕
T 君は、WebAPI の満たすべき要件を明らかにするために、本サービスのユースケースを洗い出し、表1のように整理した。また、本サービスで使用するデータベースの主なテーブルを表2のように定義した。


〔WebAPIの設計方針〕
T君は、最近のWebAPIの技術動向を調査、検討した結果、本サービスのWebAPIはREST(REpresentational State Transfer)形式を採用することとし、設計方針を次のように決めた。
・WebAPIへのアクセスは、全てHTTPSを用いて行う。
・アクセス対象へのCRUD(Create, Read, Update, Delete)の操作を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する。
・URIは、次の(1)~(5)に従って設計する。
(1) “api.example.co.jp”のように、APIであることが一目で分かるようにする。
(2) APIのバージョン番号を含める。
(3) deleteUserのようにリソースに対する操作を動詞を用いて表現するのではなく、usersのように対象とするリソースを複数形の名詞で表現し、操作はHTTPメソッドで指定する。
(4) アプリケーションや言語に依存する拡張子は含めない。
(5) リソースの関係性が一目で分かるようにする。
・全てのWebAPIでユーザ認証を行う。②ユーザ認証は、HTTPリクエストヘッダのX-Authorizationヘッダフィールドで、“ユーザID:パスワード”をBASE64エンコードしたものを設定する方式とし、設定された“ユーザID:パスワード”が“ユーザ”テーブルに存在することを確認する。“ユーザ登録”WebAPIを呼ぶ際は、ユーザIDが決まっていないので、ユーザ登録用に特別に用意したユーザIDでユーザ認証を行う。
・WebAPIの実行結果のステータスは、標準的なHTTPステータスを使用する。
200:OK
400:不正なパラメタ
401:認証失敗
404:データが存在しない
・リクエストとレスポンスのボディ部のフォーマットはJSON、文字コードはUTF-8を使用する。
設計方針に従ってWebAPIを設計した。URIテンプレートは、https://api.example.co.jp/{version}/users/{userld)/{valueType}とし、{version}はバージョン番号、{userld}はユーザID、{valueType}は計測値種別を必要に応じて指定する。
S社は、本サービスを利用する最初の健康機器として、体重計を発売することにした。体重計で利用するWebAPIでは、バージョン番号はv1、計測値種別はweightsとした。体重計で利用するWebAPIを表3に示す。

設問1:
表1中の下線①について、健康機器に送る必要があるユーザ情報を全て答えよ。
模範解答
愛称、ユーザID、パスワード
解説
解答の論理構成
-
【問題文】のユーザ登録シナリオでは、アプリが受け取る情報として
‐「愛称」
‐「ユーザID」
‐「パスワード」
‐「メールアドレス」
が列挙されています(「アプリは、愛称、メールアドレス、ユーザID、パスワードをスマホ内に保存する。」)。 -
健康機器で“ユーザ参照”WebAPIを呼び出すには、以下が必要です。
(1) URI 内の {userId}: 「URIテンプレートは、https://api.example.co.jp/{version}/users/{userld}/{valueType}」とあり、ユーザIDが必須。
(2) 認証ヘッダ: 「②ユーザ認証は、HTTPリクエストヘッダのX-Authorizationヘッダフィールドで、“ユーザID:パスワード”をBASE64エンコードしたものを設定する方式」とあるため、ユーザIDとパスワードが必要。 -
健康機器の画面で利用者が自分を識別できるようにするには、計測シナリオの「ディスプレイに表示される愛称を確認して、計測対象者を選択する。」との記述から「愛称」が必要。
-
上記により、健康機器へ送る「①必要なユーザ情報」は
愛称・ユーザID・パスワード
であると結論付けられます。
誤りやすいポイント
- 「メールアドレス」も送ると考えてしまう
→ メール送信はWebAPI側の処理であり、機器で利用しない。 - 認証に必要なのは「ユーザID」のみと思い込む
→ X-Authorization ヘッダには「ユーザID:パスワード」をセットするので両方必須。 - 「愛称」を忘れる
→ ディスプレイ表示で利用者が自分を選択するために必須。
FAQ
Q: メールアドレスを送っても害はありませんか?
A: 不要な個人情報を機器側に保持させると漏えいリスクが増えるため、最小限の情報に留めるべきです。
A: 不要な個人情報を機器側に保持させると漏えいリスクが増えるため、最小限の情報に留めるべきです。
Q: 認証方式が変われば送る情報も変わりますか?
A: はい。例えばトークンベース認証に変更すれば、機器にパスワードを送らずトークンだけで済む場合があります。
A: はい。例えばトークンベース認証に変更すれば、機器にパスワードを送らずトークンだけで済む場合があります。
Q: 愛称が重複したら機器は区別できますか?
A: 機器内部では愛称は表示用で、実際の識別は「ユーザID」で行うため、重複しても問題ありません。
A: 機器内部では愛称は表示用で、実際の識別は「ユーザID」で行うため、重複しても問題ありません。
関連キーワード: REST, HTTPメソッド、URI設計、ユーザ認証、BASE64
設問2:
本文中の下線②の認証方式を採用する際に、セキュリティ上必要となる重要な設計方針を、本文中の字句を用いて35字以内で述べよ。また、その設計方針が必要な理由を20字以内で述べよ。
模範解答
設計方針:WebAPIへのアクセスは、全てHTTPSを用いて行う。
理由:HTTPだと盗聴される危険があるから
解説
解答の論理構成
- 本文では、認証方式として
「HTTPリクエストヘッダのX-Authorizationヘッダフィールドで、“ユーザID:パスワード”をBASE64エンコードしたものを設定する方式」
と明示しています。 - BASE64 は可逆変換であり暗号化ではありません。したがって平文同等の認証情報がネットワーク上を流れる危険があります。
- そこで設計方針欄には
「WebAPIへのアクセスは、全てHTTPSを用いて行う。」
とあります。HTTPS によって通信経路を TLS で暗号化し、盗聴・改ざんを防止できます。 - よって、下線②の方式を安全に運用するには、この設計方針を必須と判断でき、理由は「HTTP では盗聴される」ためです。
誤りやすいポイント
- BASE64 を暗号化と勘違いし、追加の保護が要らないと誤解する。
- 「TLS は重いから内部ネットワークなら不要」と判断してしまう。家庭内 Wi-Fi でも盗聴リスクは残るため注意。
- 設計方針を「認証強化」や「トークン制」に置き換えてしまい、本文中の字句を守れず減点される。
FAQ
Q: BASE64 ではなくハッシュ化すれば HTTPS は不要ですか?
A: ハッシュ化してもリプレイ攻撃など別の脅威が残るため、通信経路の暗号化は依然として必要です。
A: ハッシュ化してもリプレイ攻撃など別の脅威が残るため、通信経路の暗号化は依然として必要です。
Q: HTTPS を使えば必ず安全ですか?
A: 証明書の適切な管理や TLS バージョンの更新が不十分だと脆弱になるため、運用面の対策も不可欠です。
A: 証明書の適切な管理や TLS バージョンの更新が不十分だと脆弱になるため、運用面の対策も不可欠です。
Q: HTTP/2 や HTTP/3 を使う場合も同じ方針ですか?
A: はい。いずれも TLS 上での運用が前提となるため、「全てHTTPSを用いる」方針は変わりません。
A: はい。いずれも TLS 上での運用が前提となるため、「全てHTTPSを用いる」方針は変わりません。
関連キーワード: HTTPS, BASE64, 認証情報、盗聴、TLS
設問3:体重計で利用するWebAPIの仕様について、(1)〜(4)に答えよ。
(1)表3中のaに入れる適切なAPI名を答えよ。
模範解答
a:計測データ登録
解説
解答の論理構成
- 【問題文】のユースケース「計測」では、
「健康機器は、計測した1件分の計測値種別、計測日時、計測値を“計測データ登録”WebAPIに渡す。」
と明記されています。 - 表3のaの行は、HTTPメソッドが「POST」でリクエストボディにg(計測値種別など)が送られる登録系のAPIであり、ユースケース中で呼び出される登録用APIに合致します。
- したがって、aに入るAPI名はユースケースと設計方針の両方に合わせて「計測データ登録」と決定できます。
誤りやすいポイント
- API名を英語表記(例:uploadMeasurement)で考えてしまう。設問は表3の他項目と同様、日本語名で統一されています。
- 「ユーザ登録」「ユーザ削除」など他のCRUD操作と混同し、計測データ参照やアップデートと取り違える。POSTメソッド+計測値情報の送信という条件が登録であることを示しています。
- 表3のURIやHTTPメソッドに着目せず、ユースケースの記述だけを頼りにしてしまうと、似た表現のAPI名を選んでしまうリスクがあります。
FAQ
Q: POSTなのに「アップロード」ではなく「登録」と呼ぶ理由は何ですか?
A: 設計方針で「対象への操作はHTTPメソッドで表す」としており、URIでは動詞を使わないため、API名で動詞を示す必要がありません。業務的な意味を重視して「登録」としています。
A: 設計方針で「対象への操作はHTTPメソッドで表す」としており、URIでは動詞を使わないため、API名で動詞を示す必要がありません。業務的な意味を重視して「登録」としています。
Q: ユースケースとAPI表に表記ゆれがあった場合はどちらを優先しますか?
A: 原則としてユースケースの記述が機能要件を示すため優先ですが、表3は具体的なインタフェース仕様なので両者を突き合わせ、一致する名称を選択するのが安全です。
A: 原則としてユースケースの記述が機能要件を示すため優先ですが、表3は具体的なインタフェース仕様なので両者を突き合わせ、一致する名称を選択するのが安全です。
Q: 「計測データ参照」もデータ操作ですがGETにしているのはなぜですか?
A: 設計方針でCRUDとHTTPメソッドを対応させており、Read操作はGETと定められているためです。
A: 設計方針でCRUDとHTTPメソッドを対応させており、Read操作はGETと定められているためです。
関連キーワード: REST, HTTPメソッド、URI設計、WebAPI, CRUD
設問3:体重計で利用するWebAPIの仕様について、(1)〜(4)に答えよ。
(2)表3中のb、cに入れるURIを解答群の中から選び、記号で答えよ。
模範解答
b:イ
c:ウ
解説
解答の論理構成
- URI の基本形は【問題文】の
“URIテンプレートは、https://api.example.co.jp/{version}/users/{userld}/{valueType}”
であると明示されています。 - 体重計では “バージョン番号はv1、計測値種別はweights” と指定されています。
- b「ユーザ参照」は特定ユーザ 1 名の情報(愛称・メールアドレス)を取得する処理です。リソースは「ユーザ」、操作は GET なので、
https://api.example.co.jp/v1/users/{userId}
が最小で一意に識別できます。したがって b=イ。 - c「計測データ参照」は「指定ユーザの体重計測一覧」を取得する処理です。リソース階層は「ユーザ → weights」で表す必要があるので、
https://api.example.co.jp/v1/users/{userId}/weights
となります。したがって c=ウ。
誤りやすいポイント
- 「ユーザ参照」を /v1/users(ア)と誤解しやすいですが、これでは“全ユーザ一覧”を表現してしまいます。
- 「計測データ参照」を /v1/weights(エ)とするとユーザと無関係な全体リソースになり、REST の“リソースの関係性が一目で分かるようにする”という方針【問題文】(5)に反します。
- URI に動詞や拡張子を入れないという設計方針(3)(4)を忘れ、例えば /getWeights のようにしてしまうケース。
FAQ
Q: users/{userId} と単数形にしないのはなぜですか?
A: ルートのリソース名は常に“コレクション”を複数形で表し、その下位に個体 {userId} をぶら下げるのが REST の慣用だからです。
A: ルートのリソース名は常に“コレクション”を複数形で表し、その下位に個体 {userId} をぶら下げるのが REST の慣用だからです。
Q: weights の前に日付などの検索条件を付けたい場合はどうしますか?
A: URI はリソース階層のみを示し、検索条件はクエリパラメータ(例:...?from=2023-01-01&to=2023-01-31)で渡すのが一般的です。
A: URI はリソース階層のみを示し、検索条件はクエリパラメータ(例:...?from=2023-01-01&to=2023-01-31)で渡すのが一般的です。
Q: 認証情報をヘッダに入れる方式は安全ですか?
A: 【問題文】にある “ユーザ認証は、HTTPリクエストヘッダの X-Authorization ヘッダフィールドで、“ユーザID:パスワード”を BASE64 エンコード” する方法は平文より安全ですが、より高い安全性を求める場合は OAuth2 などトークンベースの方式を検討します。
A: 【問題文】にある “ユーザ認証は、HTTPリクエストヘッダの X-Authorization ヘッダフィールドで、“ユーザID:パスワード”を BASE64 エンコード” する方法は平文より安全ですが、より高い安全性を求める場合は OAuth2 などトークンベースの方式を検討します。
関連キーワード: REST, URI設計、HTTPメソッド、リソース指向、BASE64
設問3:体重計で利用するWebAPIの仕様について、(1)〜(4)に答えよ。
(3)表3中のd、eに入れる適切なHTTPメソッドを答えよ。
模範解答
d:DELETE
e:GET
解説
解答の論理構成
-
設計方針の確認
問題文には次の記述があります。
「アクセス対象へのCRUD(Create, Read, Update, Delete)の操作を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する。」
ここから、 • Create → POST
• Read → GET
• Update → PUT
• Delete → DELETE
という対応が確定します。 -
d の判断(ユーザ削除)
表3の API 名は「ユーザ削除」です。削除操作は CRUD の Delete に該当するため、HTTP メソッドは「DELETE」となります。 -
e の判断(計測データ参照)
表3の API 名は「計測データ参照」です。参照操作は CRUD の Read に該当するため、HTTP メソッドは「GET」となります。 -
結論
• d:DELETE
• e:GET
誤りやすいポイント
- 「PUT=更新」の対応を忘れ、削除でも PUT を選択してしまう。
- 「参照」に対して POST を選ぶなど、CRUD と HTTP メソッドの基本対応を混同する。
- REST では URI に動詞を入れない方針(問題文中「deleteUser のように…ではなく…複数形の名詞で」)を見落とし、URI だけで判断しようとして迷う。
FAQ
Q: DELETE は必ずリクエストボディが空でなければなりませんか?
A: 仕様上ボディを付けても違反にはなりませんが、実装やミドルウェアによっては無視されることが多く、今回の問題では「–」と明示して空を想定しています。
A: 仕様上ボディを付けても違反にはなりませんが、実装やミドルウェアによっては無視されることが多く、今回の問題では「–」と明示して空を想定しています。
Q: 参照 API でもクエリパラメータを使えば POST にして良いのでは?
A: 問題文で「アクセス対象へのCRUD…を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する」と明示されているため、参照は GET に統一するのが正解です。
A: 問題文で「アクセス対象へのCRUD…を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する」と明示されているため、参照は GET に統一するのが正解です。
Q: REST では PUT と PATCH の違いは意識しなくていい?
A: 本問の設計方針には PATCH が登場しません。更新はすべて PUT で行う前提なので、PUT を使えばよいと判断します。
A: 本問の設計方針には PATCH が登場しません。更新はすべて PUT で行う前提なので、PUT を使えばよいと判断します。
関連キーワード: REST, HTTPメソッド、CRUD, URI設計、エンコード
設問3:体重計で利用するWebAPIの仕様について、(1)〜(4)に答えよ。
(4)表3中のf、gに入れる適切な字句を答えよ。
模範解答
f:-
g:計測日時、計測値
解説
解答の論理構成
-
f の検討
- 【問題文】には、WebAPI の設計方針として「アクセス対象へのCRUD(Create, Read, Update, Delete)の操作を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する。」とあります。
- 表3で “ユーザ参照” は HTTP メソッドが GET です。通常 REST では GET リクエストにボディを付けず、取得対象は URI で指定します。
- したがって “f” には何も送らないことを示す “-” が入ります。
-
g の検討
- “計測” ユースケースでは「健康機器は、計測した1件分の計測値種別、計測日時、計測値を“計測データ登録”WebAPIに渡す。」と記述されています。
- 表3では URI で計測値種別(体重計の場合は “weights”)を指定しているため、リクエストボディで改めて送るのは残りの「計測日時」と「計測値」です。
- よって “g” には “計測日時、計測値” が入ります。
以上より
f:-
g:計測日時、計測値
f:-
g:計測日時、計測値
誤りやすいポイント
- GET に JSON ボディを付けても動作する実装は存在しますが、REST の慣習に従うとボディは付けないのが原則です。試験では原則論で判断します。
- “g” に「計測値種別」を含めてしまう誤答が頻発します。計測値種別は URI で指定済みであることを見落とさないよう注意が必要です。
- CRUD と HTTP メソッドの対応を混同すると f も g も誤る危険があります。
FAQ
Q: GET リクエストにパラメータを渡したい場合はどうしますか?
A: REST ではクエリ文字列(例: ?userid=123)を用いるか、パスパラメータで表現します。ボディは付けません。
A: REST ではクエリ文字列(例: ?userid=123)を用いるか、パスパラメータで表現します。ボディは付けません。
Q: “計測値種別” を URI に含める利点は何ですか?
A: リソースを階層構造で表現できるため、「どの種別の計測データか」が一目で分かります。またキャッシュやルーティングの制御も行いやすくなります。
A: リソースを階層構造で表現できるため、「どの種別の計測データか」が一目で分かります。またキャッシュやルーティングの制御も行いやすくなります。
Q: BASE64 エンコードした認証情報は安全ですか?
A: BASE64 は暗号化ではなく単なるエンコードです。設計方針では「WebAPIへのアクセスは、全てHTTPSを用いて行う」と明示されているため、通信経路を TLS で暗号化して安全性を確保しています。
A: BASE64 は暗号化ではなく単なるエンコードです。設計方針では「WebAPIへのアクセスは、全てHTTPSを用いて行う」と明示されているため、通信経路を TLS で暗号化して安全性を確保しています。
関連キーワード: REST, HTTPメソッド、URI設計、BASE64, JSON
設問4:
リクエストのボディ部が{"nickname":""}で“ユーザ登録”WebAPIが呼ばれた場合、どのような結果を返せばよいか。20字以内で述べよ。
模範解答
HTTPステータスを400で返す。
解説
解答の論理構成
- 【問題文】では“ユーザ登録”WebAPIのリクエストとして「愛称、メールアドレス」を必須項目と定義しています。
引用:
・表1「利用者は、アプリの“ユーザ登録”画面で、登録する利用者の愛称(中略)とメールアドレスを入力する。」
・表3「ユーザ登録 リクエストのボディ部:愛称、メールアドレス」 - 設計方針で、不正なパラメタに対するレスポンスを明示しています。
引用:
「WebAPIの実行結果のステータスは、標準的なHTTPステータスを使用する。
200:OK
400:不正なパラメタ」 - 提示されたリクエスト例は {"nickname": ""} であり、必須である「愛称」が空文字、さらに「メールアドレス」が欠落しています。これは【問題文】の定義と矛盾するため「不正なパラメタ」と判断できます。
- 従って設計方針の規定どおり、HTTPステータスコード「400」を返すのが正しい動作となります。
誤りやすいポイント
- 200(OK)を返してしまう
入力チェックを実装し忘れ、「空でも登録できる」と誤解してしまうケース。 - 401(認証失敗)と混同
今回はリクエストパラメータの問題であり、ユーザ認証自体は行えています。 - 404(データが存在しない)を選択
登録フェーズなので「存在しないデータ」は論点外です。
FAQ
Q: メールアドレスだけが欠けている場合も同じく 400 ですか?
A: はい。“愛称、メールアドレス”のいずれか一方でも欠落・空文字であれば「不正なパラメタ」に該当し 400 を返します。
A: はい。“愛称、メールアドレス”のいずれか一方でも欠落・空文字であれば「不正なパラメタ」に該当し 400 を返します。
Q: 400 返却時にエラーメッセージをボディに含めても良いですか?
A: 設問はステータスコードのみを問うていますが、実装では原因を示す JSON を添えると利用者(アプリ)が復旧しやすくなります。
A: 設問はステータスコードのみを問うていますが、実装では原因を示す JSON を添えると利用者(アプリ)が復旧しやすくなります。
Q: 認証用ユーザIDが誤っていた場合はどうなりますか?
A: 設計方針の「401:認証失敗」に該当します。パラメータが正しくても認証に失敗すれば 401 を返します。
A: 設計方針の「401:認証失敗」に該当します。パラメータが正しくても認証に失敗すれば 401 を返します。
関連キーワード: REST, HTTPステータスコード、バリデーション、JSON, パラメータチェック


