クイズの説明
Step 2で学んだ内容の理解度をチェックします。
- 全8問
- 合格ライン: 80%(7問正解)
- 不合格の場合は復習してから再挑戦してください
問題
Q1. リチャードソン成熟度モデルの Level 2 の特徴として正しいのはどれですか?
- A) 単一URIですべての操作を行う
- B) リソースごとにURIを分けるが、メソッドはすべてPOST
- C) HTTPメソッド(GET, POST, PUT, DELETE)を正しく使い分ける
- D) レスポンスにハイパーメディアリンクを含める
答えを見る
正解: C
リチャードソン成熟度モデル:
- Level 0: 単一URI、単一メソッド
- Level 1: リソースごとにURIを分離
- Level 2: HTTPメソッドを正しく使い分ける(GET, POST, PUT, DELETE)
- Level 3: HATEOAS(ハイパーメディアリンクを含める)
Q2. HATEOASの最大のメリットはどれですか?
- A) レスポンスサイズが小さくなる
- B) クライアントがAPIのURLをハードコードする必要がなくなる
- C) 認証が不要になる
- D) データベースへのアクセスが高速になる
答えを見る
正解: B
HATEOAS(Hypermedia As The Engine Of Application State)では、レスポンスに「次にできる操作」のリンクが含まれます。クライアントはこのリンクをたどることで操作を行うため、URLをハードコードする必要がありません。これにより、サーバー側でURLを変更してもクライアントへの影響を最小限に抑えられます。
Q3. OAuth 2.0 の Authorization Code Grant フローで、最初にクライアントが受け取るものはどれですか?
- A) アクセストークン
- B) リフレッシュトークン
- C) 認可コード
- D) APIキー
答えを見る
正解: C
Authorization Code Grant のフロー:
- クライアントが認可サーバーにリダイレクト
- ユーザーが認可を許可
- 認可コードがクライアントに返される
- クライアントが認可コードをアクセストークンに交換
- アクセストークンでAPIにアクセス
認可コードは一時的なもので、アクセストークンとの交換に使用されます。
Q4. JWTのペイロードに含めるべきでない情報はどれですか?
- A) ユーザーID(sub)
- B) 有効期限(exp)
- C) パスワードのハッシュ値
- D) ユーザーのロール
答えを見る
正解: C
JWTのペイロードはBase64エンコードされているだけで、暗号化されていません。そのため、パスワードのハッシュ値などの機密情報を含めるべきではありません。
含めるべき情報: sub(ユーザーID)、exp(有効期限)、iat(発行日時)、role(ロール)など。
Q5. レート制限で「429 Too Many Requests」を返す際に、一緒に返すべきヘッダーはどれですか?
- A) Content-Length
- B) Retry-After
- C) Cache-Control
- D) ETag
答えを見る
正解: B
429 Too Many Requests を返す際は、Retry-After ヘッダーでクライアントに再試行可能になるまでの時間(秒)を伝えます。
加えて、RateLimit-Limit、RateLimit-Remaining、RateLimit-Reset のヘッダーも設定することで、クライアントがレート制限の状況を把握しやすくなります。
Q6. トークンバケットアルゴリズムの特徴として正しいのはどれですか?
- A) 固定の時間枠でカウンターをリセットする
- B) 一定速度でトークンが補充され、バースト的なリクエストに対応できる
- C) すべてのリクエストのタイムスタンプを保存する
- D) リクエストを一切拒否しない
答えを見る
正解: B
トークンバケットアルゴリズムでは:
- バケットにトークンが一定速度で補充される
- 各リクエストでトークンを1つ消費
- バケットに溜まったトークン分だけバースト的なリクエストに対応可能
- トークンがなくなったらリクエストを拒否
固定ウィンドウの境界問題を避けつつ、短時間のバースト(突発的な大量リクエスト)にも対応できます。
Q7. 認証(Authentication)と認可(Authorization)の違いとして正しいのはどれですか?
- A) 認証は権限チェック、認可は身元確認
- B) 認証は身元確認、認可は権限チェック
- C) 認証と認可は同じ意味
- D) 認証はクライアント側、認可はサーバー側の処理
答えを見る
正解: B
- 認証(Authentication): 「あなたは誰?」→ 身元の確認(ログイン、トークン検証)
- 認可(Authorization): 「何が許可されている?」→ 権限の確認(ロール、スコープ)
認証に失敗した場合は 401 Unauthorized、認可に失敗した場合は 403 Forbidden を返します。
Q8. サブリソースのネストが深くなりすぎた場合の対処法として最も適切なのはどれですか?
- A) ネストを気にせず深くする
- B) すべてのリソースをトップレベルに配置する
- C) 深いネストのリソースをトップレベルに昇格させ、クエリパラメータで絞り込む
- D) URLにクエリパラメータを一切使わない
答えを見る
正解: C
ネストは2階層までが推奨です。3階層以上になる場合は、深い階層のリソースをトップレベルに昇格させ、親リソースのIDをクエリパラメータで指定します。
例:
GET /api/v1/users/123/orders/456/items/789(深すぎる)GET /api/v1/order-items/789(トップレベルに昇格)GET /api/v1/order-items?orderId=456(クエリパラメータで絞り込み)
結果
7問以上正解の場合
合格です。おめでとうございます。
Step 2「RESTful API設計の深淵」を完了しました。 次は Step 3「OpenAPIで契約を定義しよう」に進みましょう。
6問以下の場合
もう少し復習しましょう。
| 問題 | 復習セクション |
|---|---|
| Q1, Q2 | step2_2 HATEOAS とリチャードソン成熟度モデル |
| Q3, Q4, Q7 | step2_3 認証と認可の設計 |
| Q5, Q6 | step2_4 レート制限とスロットリング |
| Q8 | step2_1 リソース設計とURI設計 |
推定所要時間: 30分