応用情報技術者 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/{userId}/{valueType}とし、{version}はバージョン番号、{userId}はユーザ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)に答えよ。
問題文を見る模範解答
b:イ
c:ウ
解説
解答の導き方
設問は表3の空欄[b]と[c]に入るURIを選ぶ問題です。問題文の前提で特に重要な記述は次の2点です。
・「URIテンプレートは、https://api.example.co.jp/{version}/users/{userId}/{valueType}」
・「体重計で利用するWebAPIでは、バージョン番号はv1、計測値種別はweightsとした」
・「URIテンプレートは、https://api.example.co.jp/{version}/users/{userId}/{valueType}」
・「体重計で利用するWebAPIでは、バージョン番号はv1、計測値種別はweightsとした」
これらを使って段階的に考えます。
- 計測データ参照(設問[c])の検討
- 表2の「計測データ」テーブルには「ユーザID, 計測値種別, 計測日時, 計測値」とあるため、計測データは特定のユーザに紐付くデータです。したがってURIはユーザを特定する要素({userId})を含むべきです。
- URIテンプレートに{version}→v1、{valueType}→weightsを当てはめると、計測データ(weights)を参照するURIは
https://api.example.co.jp/v1/users/{userId}/weights
となり、解答群のウ(https://api.example.co.jp/v1/users/{userId}/weights)と一致します。 - 選択肢エ(https://api.example.co.jp/v1/weights)はユーザ文脈が欠けており、表の構造や「リソースの関係性が一目で分かるようにする」という設計方針に反します。
- ユーザ参照(設問[b])の検討
- 表2の「ユーザ」テーブルに「ユーザID, パスワード, 愛称, メールアドレス, 登録日時」とあり、ユーザ参照は特定のユーザIDに対する操作です。
- URIテンプレートに{version}→v1を当てはめ、特定ユーザを示す{userId}を含めれば、ユーザ取得のURIは
https://api.example.co.jp/v1/users/{userId}
となり、解答群のイ(https://api.example.co.jp/v1/users/{userId})と一致します。 - 選択肢ア(https://api.example.co.jp/v1/users)はコレクション(ユーザの作成や一覧取得)に対応するエンドポイントで、単一ユーザの参照には不適切です。
結論:b:イ、c:ウ
誤りやすいポイント
- /usersと /users/{userId} を混同する:/usersはコレクション、/users/{userId} は単一リソースです。
- valueType(weights)をルートに置く(/weights)ミス:計測データはユーザに紐付くため、/users/{userId}/weightsの形が正しいです。
- バージョン番号を忘れる:テンプレートに {version} があるのでv1を必ず含めます。
- HTTPメソッドを誤る:設計方針で「CRUD…をそれぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する」とあるため、参照はGETです。
- 認証の扱いでの誤解:設計では「ユーザ認証は、HTTPリクエストヘッダのX-Authorizationヘッダフィールドで、“ユーザID:パスワード”をBASE64エンコードしたものを設定する方式」とありますが、BASE64は可逆のエンコードで暗号化ではありません。認証情報の機密性はHTTPSに依存するため、実務ではトークン方式やOAuth2等の検討が必要です。
FAQ
Q: ユーザ参照とユーザ削除は同じURIにできますか?
A: はい。設計方針で「対象とするリソースを複数形の名詞で表現し、操作はHTTPメソッドで指定する」とあるため、/v1/users/{userId} に対してGETで参照、DELETEで削除を実現します。
A: はい。設計方針で「対象とするリソースを複数形の名詞で表現し、操作はHTTPメソッドで指定する」とあるため、/v1/users/{userId} に対してGETで参照、DELETEで削除を実現します。
Q: 設計にあるX-AuthorizationヘッダのBASE64は安全ですか?
A: BASE64はエンコードであり可逆です。BASE64自体は機密性を提供しないため、送受信時の秘匿はHTTPS(TLS)に依存します。より安全にするには、パスワードを直接送らないトークン認証(Bearerトークン)、OAuth2の利用、あるいはパスワードのハッシュ化・短期トークン化などを検討してください。
A: BASE64はエンコードであり可逆です。BASE64自体は機密性を提供しないため、送受信時の秘匿はHTTPS(TLS)に依存します。より安全にするには、パスワードを直接送らないトークン認証(Bearerトークン)、OAuth2の利用、あるいはパスワードのハッシュ化・短期トークン化などを検討してください。
Q: 計測データ参照のフィルタ指定はボディで行えますか?
A: 一般にGETはURIパスやクエリ文字列で識別子や絞り込みを指定し、GETのリクエストボディは用いない方が互換性・可搬性で安全です。表3の計測データ参照のリクエストは「–」となっており、URIで必要な情報({userId} 等)を与える設計です。
A: 一般にGETはURIパスやクエリ文字列で識別子や絞り込みを指定し、GETのリクエストボディは用いない方が互換性・可搬性で安全です。表3の計測データ参照のリクエストは「–」となっており、URIで必要な情報({userId} 等)を与える設計です。
関連キーワード: REST、URIテンプレート、HTTPメソッド、エンドポイント、トークン認証
設問3:体重計で利用するWebAPIの仕様について、(1)〜(4)に答えよ。
問題文を見る模範解答
d:DELETE
e:GET
解説
解答の論理構成
-
設計方針の確認
問題文には次の記述があります。
「アクセス対象へのCRUD(Create, Read, Update, Delete)の操作を、それぞれHTTPメソッドのPOST, GET, PUT, DELETEで提供する。」
ここから、 • Create → POST
• Read → GET
• Update → PUT
• Delete → 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)に答えよ。
問題文を見る模範解答
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, パラメータチェック





