応用情報技術者過去問題 平成29年秋期 午後問4
⇄問題文と設問を画面2分割で開く⇱問題PDF問4 システムアーキテクチャ
WebAPIの設計に関する次の記述を読んで,設問1~4に答えよ。
S社は,家庭向けの体重計,血圧計,活動量計などの健康機器を製造販売している会社である。競合する他社との差別化を図るために,クラウドサービスを使った健康管理サービス(以下,本サービスという)の提供を検討している。例えば,健康機器で計測したデータ(以下,計測データという)を本サービスで管理して,スマートフォン(以下,スマホという)のアプリケーションプログラム(以下,アプリという)で計測データを確認できるようにすることを考えている。開発部のT君を中心に,本サービスを設計することになった。
T君は,本サービスのアーキテクチャを検討し,クラウドサービス上に健康機器やアプリから呼ばれるWebAPIを用意し,そのWebAPIを介して,計測データのアップロードや確認を行う方式を採用することにした。
〔本サービスの前提〕
T君は,本サービスの全体を図1のように構成し,前提を次のように考えた。
T君は,WebAPIの満たすべき要件を明らかにするために,本サービスのユースケースを洗い出し,表1のように整理した。また,本サービスで使用するデータベースの主なテーブルを表2のように定義した。〔WebAPIの設計方針〕
T君は,最近のWebAPIの技術動向を調査,検討した結果,本サービスのWebAPIはREST(REpresentational State Transfer)形式を採用することとし,設計方針を次のように決めた。
https://api.example.co.jp/{version}/users/{userId}/{valueType}
とし,{version}はバージョン番号,{userId}はユーザID,{valueType}は計測値種別を必要に応じて指定する。
S社は,本サービスを利用する最初の健康機器として,体重計を発売することにした。体重計で利用するWebAPIでは,バージョン番号はv1,計測値種別はweightsとした。体重計で利用するWebAPIを表3に示す。
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)に従って設計する。
- "api.example.co.jp"のように,APIであることが一目で分かるようにする。
- APIのバージョン番号を含める。
- deleteUserのようにリソースに対する操作を動詞を用いて表現するのではなく,usersのように対象とするリソースを複数形の名調で表現し,操作はHTTPメソッドで指定する。
- アプリケーションや言語に依存する拡張子は含めない。
- リソースの関係性が一目で分かるようにする。
- 全てのWebAPIでユーザ認証を行う。②ユーザ認証は,HTTPリクエストヘッダーのX-Authorizationヘッダーフィールドで,"ユーザID:パスワードをBASE64エンコードしたものを設定する方式とし,設定された"ユーザID:パスワード"が"ユーザ"テーブルに存在することを確認する。"ユーザ登録"WebAPIを呼ぶ際は,ユーザIDが決まっていないので,ユーザ登録用に特別に用意したユーザIDでユーザ認証を行う。
- WebAPIの実行結果のステータスは,標準的なHTTPステータスを使用する。
200:OK
400:不正なパラメータ
401:認証失敗
404:データが存在しない - リクエストとレスポンスのボディ部のフォーマットはJSON,文字コードはUTF-8を使用する。
https://api.example.co.jp/{version}/users/{userId}/{valueType}
とし,{version}はバージョン番号,{userId}はユーザID,{valueType}は計測値種別を必要に応じて指定する。
S社は,本サービスを利用する最初の健康機器として,体重計を発売することにした。体重計で利用するWebAPIでは,バージョン番号はv1,計測値種別はweightsとした。体重計で利用するWebAPIを表3に示す。
設問1
表1中の下線①について,健康機器に送る必要があるユーザ情報を全て答えよ。
解答入力欄
- o:
解答例・解答の要点
- o:愛称,ユーザID,パスワード
解説
まず「アプリに登録されている情報とは何であるか」を考えてみると、"ユーザの登録"のユースケースに説明されているように、愛称、メールアドレス、ユーザID、パスワードの4つです。
〔WebAPIの設計方針〕では、HTTPリクエストヘッダー内のX-Authorizationヘッダーでユーザ名とパスワードを用いる認証を全てのWebAPIで行うと説明されています。健康機器はアプリから受け取った情報を用いて"ユーザ参照"や"計測データ登録"WebAPIを呼ぶので、「ユーザ名」と「パスワード」が必要です。
さらに"計測"のユースケースに注目すると、「ディスプレイに表示される愛称を確認して…」という記述があります。すなわち健康機器には愛称が保存されていなくてはなりません。健康機器へのユーザ登録以降、アプリから健康機器に情報を送る場面がないことを考えると、必要なユーザ情報には「愛称」が含まれ、ID・パスワードとともに健康機器内に保存されると判断できます。
したがって健康機器へのユーザ登録時に、アプリから健康機器に送る情報は「愛称,ユーザID,パスワード」の3つです。
∴愛称,ユーザID,パスワード
〔WebAPIの設計方針〕では、HTTPリクエストヘッダー内のX-Authorizationヘッダーでユーザ名とパスワードを用いる認証を全てのWebAPIで行うと説明されています。健康機器はアプリから受け取った情報を用いて"ユーザ参照"や"計測データ登録"WebAPIを呼ぶので、「ユーザ名」と「パスワード」が必要です。
さらに"計測"のユースケースに注目すると、「ディスプレイに表示される愛称を確認して…」という記述があります。すなわち健康機器には愛称が保存されていなくてはなりません。健康機器へのユーザ登録以降、アプリから健康機器に情報を送る場面がないことを考えると、必要なユーザ情報には「愛称」が含まれ、ID・パスワードとともに健康機器内に保存されると判断できます。
したがって健康機器へのユーザ登録時に、アプリから健康機器に送る情報は「愛称,ユーザID,パスワード」の3つです。
∴愛称,ユーザID,パスワード
設問2
本文中の下線②の認証方式を採用する際に,セキュリティ上必要となる重要な設計方針を,本文中の字句を用いて35字以内で述べよ。また,その設計方針が必要な理由を20字以内で述べよ。
解答入力欄
- 設計方針:
- 理由:
解答例・解答の要点
- 設計方針:
WebAPIへのアクセスは,全てHTTPSを用いて行う (27文字) - 理由:HTTPだと盗聴される危険があるから (18文字)
解説
下線②の前文では「全てのWebAPIでユーザ認証を行う」と説明されています。WebAPIへのアクセスでは、ユーザ名:パスワードの認証情報がHTTPリクエストヘッダーに含まれているので、平文の通信(HTTP通信)だと盗聴などにより認証情報が漏えいし、不正利用に繋がるおそれがあります。認証情報はBASE64でエンコードされていますが、BASE64は暗号化方式ではないため簡単に平文に戻せます。このため、安全な認証を行うにはWebAPIへのアクセスにHTTPSを用いる必要があります。
重要となる設計方針はどれかと問うているので〔WebAPIの設計方針〕から探すと、1つ目の「WebAPIへのアクセスは,全てHTTPSを用いて行う」がそれに該当します。
∴設計方針:WebAPIへのアクセスは,全てHTTPSを用いて行う
理由:HTTPだと盗聴される危険があるから
重要となる設計方針はどれかと問うているので〔WebAPIの設計方針〕から探すと、1つ目の「WebAPIへのアクセスは,全てHTTPSを用いて行う」がそれに該当します。
∴設計方針:WebAPIへのアクセスは,全てHTTPSを用いて行う
理由:HTTPだと盗聴される危険があるから
- BASE64
- マルチバイト文字やバイナリデータを印字可能な64種類の英数字のみで表されるテキストデータに変換する方式。MIMEで規定されている
設問3
体重計で利用するWebAPIの仕様について,(1)~(4)に答えよ。
- 表3中のaに入れる適切なAPI名を答えよ。
- 表3中のb,cに入れるURIを解答群の中から選び,記号で答えよ。
- 表3中のd,eに入れる適切なHTTPメソッドを答えよ。
- 表3中のf,gに入れる適切な字句を答えよ。
b,c に関する解答群
- https://api.example.co.jp/v1/users
- https://api.example.co.jp/v1/users/{userId}
- https://api.example.co.jp/v1/users/{userId}/weights
- https://api.example.co.jp/v1/weight
解答入力欄
- a:
- b:
- c:
- d:
- e:
- f:
- g:
解答例・解答の要点
- a:計測データ登録
- b:イ
- c:ウ
- d:DELETE
- e:GET
- f:-
- g:計測日時,計測値
解説
- 〔aについて〕
対応するHTTPメソッドが"POST"なので登録に係るAPIと判断できます。ユースケースに登場する5つのWebAPIのうち表3に存在しない"計測データ登録"が適切です。
∴a=計測データ登録 - URIテンプレートは以下の通りです。〔bについて〕
バージョン番号とユーザIDはどの操作でも必須です。計測値種別は必要に応じて指定されますが、ユーザ参照では関係ないので省略されます。したがってユーザ参照は{version}部分に"v1"、{valueType}を省略した以下のURIなります。
https://api.example.co.jp/v1/users/{userId}
∴b=イ:https://api.example.co.jp/v1/users/{userId}
〔cについて〕
計測データ参照では取得したい計測値の種別をURIの{valueType}で指定します。体重計で使用する計測値種別は"weights"なので以下のURIになります。
https://api.example.co.jp/v1/users/{userId}/weights
∴c=ウ:https://api.example.co.jp/v1/users/{userId}/weights - 〔WebAPIの設計方針〕では、「CRUD(Create,Read,Update,Delete)の操作を,それぞれHTTPメソッドのPOST,GET,PUT,DELETEで行う」と説明されています。つまりCRUDの種類によってHTTPメソッドが決定されます。〔dについて〕
dが含まれるAPI名は"ユーザ削除"ですから、HTTPメソッドはDELETEになります。
∴d=DELETE
〔eについて〕
eが含まれるAPI名は"計測データ参照"ですから、HTTPメソッドはGETになります。
∴e=GET - 〔fについて〕
"ユーザ参照"APIで必要となる情報はユーザIDのみです。ユーザIDはURIの{userId}の部分に含まれているので、"ユーザ削除"や"計測データ参照"と同じようにリクエストボディとして指定するデータは何もありません。
∴f=-
〔gについて〕
計測のユースケースを読むと、「健康機器は,計測した1件分の計測値種別,計測日時,計測値を"計測データ登録"WebAPIに渡す」と説明されています。"計測値種別"はURIの"valueType"に指定することでWebAPIに伝えられますが、残りの2つについてはURIだけではWebAPIに渡せません。したがって"計測日時"と"計測値"はHTTPリクエストのボディ部に指定することになります。
∴g=計測日時,計測値
設問4
リクエストのボディ部が{"nickname":""}で"ユーザ登録"WebAPIが呼ばれた場合,どのような結果を返せばよいか。20字以内で述べよ。
解答入力欄
- o:
解答例・解答の要点
- o:HTTPステータスを400で返す (16文字)
解説
リクエストボディ部のフォーマットであるJSON(JavaScript Object Notation)とは、
"ユーザ登録"の手順では、アプリからWebAPIに"愛称"と"メールアドレス"を渡すことになっていますが、このリクエストには必須パラメータである"メールアドレス"が不足しています。また、愛称は「アプリや健康機器で利用者を識別するためのもの」であり登録後の他の操作で使用されるため、"ユーザ"テーブルに空文字で登録されることは許されません。したがって空文字("")は、"愛称"パラメータの値として不適切であると考えられます。
WebAPIはパラメータ不足により処理を実行できないのでクライアント側にエラーを返すことになります。「WebAPIの実行結果のステータスは,標準的なHTTPステータスを使用する」という設計方針とその下のHTTPステータスの例に従うと、実行結果として400番(不正なパラメータによるエラー)を返すのが適切と判断できます。
∴HTTPステータスを400で返す
{パラメータ名1:値1,パラメータ名2:値2}
というように":(コロン)"で連結したパラメータ名と値の組を",(コンマ)"で区切って指定する形式です。つまりリクエストボディ部の{"nickname":""}が意味するところは、WebAPIに渡された愛称データが空文字であり、メールアドレスのパラメータがないということです。"ユーザ登録"の手順では、アプリからWebAPIに"愛称"と"メールアドレス"を渡すことになっていますが、このリクエストには必須パラメータである"メールアドレス"が不足しています。また、愛称は「アプリや健康機器で利用者を識別するためのもの」であり登録後の他の操作で使用されるため、"ユーザ"テーブルに空文字で登録されることは許されません。したがって空文字("")は、"愛称"パラメータの値として不適切であると考えられます。
WebAPIはパラメータ不足により処理を実行できないのでクライアント側にエラーを返すことになります。「WebAPIの実行結果のステータスは,標準的なHTTPステータスを使用する」という設計方針とその下のHTTPステータスの例に従うと、実行結果として400番(不正なパラメータによるエラー)を返すのが適切と判断できます。
∴HTTPステータスを400で返す