APIセキュリティ入門:REST・認証・認可
APIのHTTPメソッドと意味
この回でやること
GET・POST・PUT・PATCH・DELETEの意味と、安全性・冪等性。APIではメソッドごとに別の入り口として数える、という見方を足します。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
HTTPメソッドは、URLが指すリソースに対する動詞で、GETは取得、DELETEは削除を表します。この回は意味の復習ではなく、APIを攻撃面として見るための入り口の数え方を足します。
読み終えるころには、一本のURLに対してGET以外のメソッドを順に送り、返りを並べる点検ができるようになります。
メソッドは操作を表す
前回、URLがリソースという名詞を指すことを見ました。メソッドは、そのリソースに対する動詞です。主なものは次のとおりです。
| メソッド | 操作 | 安全 | 冪等 |
|---|---|---|---|
| GET | 取得する | はい | はい |
| POST | 新しく作る | いいえ | いいえ |
| PUT | まるごと置き換える | いいえ | はい |
| PATCH | 一部を変える | いいえ | いいえ |
| DELETE | 削除する | いいえ | はい |
安全とは、サーバーの状態を変えないこと。冪等とは、同じ要求を何度送っても結果が変わらないことです。GETは何度読んでも副作用が無く、DELETEは二度送っても「消えている」状態は同じです。POSTは送るたびに新しい注文が増えるので、どちらでもありません。
同じURLでも、メソッドごとに別の入り口
ここがAPIで新しく効いてくる見方です。/api/orders/1043という一つのURLに、GETは閲覧、PUTは書き換え、DELETEは削除という、まったく別の操作がぶら下がっています。一つのURLは一つの入り口ではなく、メソッドの数だけ入り口があります。
プレーンテキスト
GET /api/orders/1043 → 見る
PUT /api/orders/1043 → 全部書き換える
DELETE /api/orders/1043 → 消す画面に削除ボタンが無くても、サーバーがDELETEを受け付ける作りなら、プロキシからDELETE /api/orders/1043を直接送れます。閲覧の側だけ持ち主を確かめていて、削除の側の判定を書き忘れていると、画面には無いはずの操作が通ってしまいます。
どう直すか
エンドポイントとメソッドの組ごとに、許すかどうかを判定します。URLに認可を掛けたつもりでも、それがGETにしか効いていないことがあるので、PUT・PATCH・DELETEの側も一つずつ確かめます。使わせないメソッドには、黙って通さず405を返して拒みます。
手を動かすときは、練習用の環境で、自分が閲覧できる/api/orders/1043に対してGET以外のメソッドを順に送り、返るステータスコードを並べてください。GETは200なのにDELETEも200が返るなら、そのメソッドの認可が抜けています。