平成29年秋期試験午後問題 問4

問4 システムアーキテクチャ

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

〔本サービスの前提〕
 T君は,本サービスの全体を図1のように構成し,前提を次のように考えた。
pm04_1.png
  • 健康機器は,表示用のディスプレイ,インターネットにアクセスするための無線LAN(以下,Wi-Fiという),スマホと通信するためのBluetooth機能を装備する。
  • 家庭内はWi-Fiルータでインターネットにアクセスできる環境とする。
  • 計測時には,健康機器はスマホを介することなく,Wi-Fi経由で本サービスにアクセスする。
〔本サービスのユースケース〕
 T君は,WebAPIの満たすべき要件を明らかにするために,本サービスのユースケースを洗い出し,表1のように整理した。また,本サービスで使用するデータベースの主なテーブルを表2のように定義した。
pm04_2.png
〔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を使用する。
 設計方針に従ってWebAPIを設計した。URIテンプレートは,
 https://api.example.co.jp/{version}/users/{userId}/{valueType}
とし,{version}はバージョン番号,{userId}はユーザID,{valueType}は計測値種別を必要に応じて指定する。
 S社は,本サービスを利用する最初の健康機器として,体重計を発売することにした。体重計で利用するWebAPIでは,バージョン番号はv1,計測値種別はweightsとした。体重計で利用するWebAPIを表3に示す。
pm04_3.png

設問1

表1中の下線①について,健康機器に送る必要があるユーザ情報を全て答えよ。

解答例・解答の要点

愛称,ユーザID,パスワード

解説

まず「アプリに登録されている情報とは何であるか」を考えてみると、"ユーザの登録"のユースケースに説明されているように、愛称、メールアドレス、ユーザID、パスワードの4つです。

〔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だと盗聴される危険があるから
BASE64
マルチバイト文字やバイナリデータを印字可能な64種類の英数字のみで表されるテキストデータに変換する方式。MIMEで規定されている

設問3

体重計で利用するWebAPIの仕様について,(1)~(4)に答えよ。
  • 表3中のaに入れる適切なAPI名を答えよ。
  • 表3中のbcに入れるURIを解答群の中から選び,記号で答えよ。
  • 表3中のdeに入れる適切なHTTPメソッドを答えよ。
  • 表3中のfgに入れる適切な字句を答えよ。
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:DELETE
    e:GET
  • f:-
    g:計測日時,計測値

解説

  • aについて〕
    対応するHTTPメソッドが"POST"なので登録に係るAPIと判断できます。ユースケースに登場する5つのWebAPIのうち表3に存在しない"計測データ登録"が適切です。

    a=計測データ登録

  • URIテンプレートは以下の通りです。
    pm04_4.png
    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メソッドが決定されます。
    pm04_5.png
    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字以内で述べよ。

解答例・解答の要点

HTTPステータスを400で返す (16文字)

解説

リクエストボディ部のフォーマットであるJSON(JavaScript Object Notation)とは、
{パラメータ名1:値1,パラメータ名2:値2}
というように":(コロン)"で連結したパラメータ名と値の組を",(コンマ)"で区切って指定する形式です。つまりリクエストボディ部の{"nickname":""}が意味するところは、WebAPIに渡された愛称データが空文字であり、メールアドレスのパラメータがないということです。

"ユーザ登録"の手順では、アプリからWebAPIに"愛称"と"メールアドレス"を渡すことになっていますが、このリクエストには必須パラメータである"メールアドレス"が不足しています。また、愛称は「アプリや健康機器で利用者を識別するためのもの」であり登録後の他の操作で使用されるため、"ユーザ"テーブルに空文字で登録されることは許されません。したがって空文字("")は、"愛称"パラメータの値として不適切であると考えられます。

WebAPIはパラメータ不足により処理を実行できないのでクライアント側にエラーを返すことになります。「WebAPIの実行結果のステータスは,標準的なHTTPステータスを使用する」という設計方針とその下のHTTPステータスの例に従うと、実行結果として400番(不正なパラメータによるエラー)を返すのが適切と判断できます。

∴HTTPステータスを400で返す
模範解答

Pagetop