『Web API: The Good Parts』学習メモ
Ch01 what's Web API
- Web API: HTTP protocolを利用してnetwork越しに呼び出すAPI
- API: Application Protocol Interface
- APIのpattern
- 使用例
- APIで公開するもの
- Web APIを美しく設計する重要性
- 使いやすさ,変更しやすさ,頑強さ,魅力
- Web APIを美しくするには
- 仕様が決まっているものは仕様に従う
- 仕様がないものはdefacto standardに従う
- RESTとWeb API
- RESTの本来の意味に合っていない使われ方がされている
- RESTの考えを適用する場面は多いが,すべてがRESTではない
- target developerの数とAPIの設計思想
- LSUDs(Large Set of Unknown Developers)とSSKDs(Small Set of Known Developers)
- SSKDs向けは,RESTを基本にしたAPIでは不十分
- → Orchestration layer
- まとめ
Ch02 endpointのdesignとrequestの形式
- APIとして公開する機能をdesign
- UCを考える
- API endpointの考え方
- HTTP methodとendpoint
- APIのendpoint design
- 検索とquery parameterのdesign
- loginとOAuth 2.0
- 認証のAPIとして,Authが真っ先に検討できる標準仕様
- 自社開発のClient Applicationにおいて,ユーザ名とパスワードをapplication内に入力して認証を行う場合
- OAuthのGrant Typeのうち,Resource Owner Password Credentialsを使う
- 扱い方
- OAuthのGrant Typeのうち,Resource Owner Password Credentialsを使う
- access tokenの有効期限と更新
- other Grant Type
- Client Credentials: User name, Password不要な認証.Clientの認証のみ行う.
- 自分の情報へのalias
- me, self
- ほかのユーザの情報の処理とは,処理自体を分岐することでバグを防げる
- hostnameとendpointの共通部分
- api.example.comの形が最も適当
- SSKDsとAPI design
- HATEOASとREST LEVEL3 API
- まとめ
- [Good] 覚えやすく,どんな機能を持つか一目でわかるendpointにする
- [Good] 適切なHTTP methodを利用する
- [Good] 適切な英単語を利用.単複にも注意.
- [Good] 認証はOAuth 2.0
Ch03 response dataの design
- data format
- JSONPの取り扱い
- dataの内部構造の考え方
- 各dataのformat
- response dataのdesign
- あるデータを返すときは同じ構造になるよう,それぞれのデータの構造を定義してしまうとsimpleで〇
- errorの表現
- proper status code
- detail
- bodyで〇.headerに入れるのも悪くはなさそう
- detail code, detail information link
- HTMLで返らないようにする
- @maintenance
- 503
- Retry-After
- 意図的に不正確な情報を返す
- まとめ
Ch04 HTTPの仕様を最大限利用する
- 意義
- 不本意に独自仕様をいれてしまう危険性を下げる
- HTTP protocolがenvelopeの役割という例
- status codeを正しく使う
- APIで使うcode一覧
- 2xx: success
- 204: No Contentは,是非あり
- PUT, PATCHは,200とともに操作したデータを返す(POSTは201)
- DELETEは204
- 204: No Contentは,是非あり
- 3xx: 追加で処理が必要
- redirect: 301, 302, 303, 307
- Locationを伴う
- POSTによるデータ送信 → GETで別のページを表示のケースが多い
- 302, 301はmethodの変更を許可
- 308, 307は不許可
- APIではできるだけredirectを避ける
- 300: Multiple Choices
- 304: Not Modified
- redirect: 301, 302, 303, 307
- 4xx: Clientのrequestに問題があった場合
- 400: Bad Request
- ほかのcodeでは表せない「その他」
- 401: Unauthorized. Authentication(認証) error. ← 誰ですか?
- 403: Forbidden. Authorization(認可) error. ← 許可がないよ.
- ほかにも色々ある
- 400: Bad Request
- 5xx: Serverに問題があった場合
- cacheとHTTPの仕様
- cacheのmerit. → 可能な限り利用するべき
- proxy serverへの考慮必要
- reverse proxy
- Expiration Model
- fresh ←→ stale
- Expires
- 特定の日時に更新されることがあらかじめわかっているdataに使う
- Cache-Control
- max-age
- HTTP時間
- RFC1123を使う
- HTTP時間
- max-age
- Validation Model
- 条件付きrequest
- Last-Modified, ETag (Entity Tag)
- If-Modified-Since, If-None-Match
- e.g. MurmurHash3
- strong/weak Validation
- weakなら,広告などの違いは無視できる
- 条件付きrequest
- Heuristic Expiration(発見的期限切れ)
- ClientがCacheの期限を自分で決める
- Cache-Control: no-cache
- VaryでCacheの単位を指定
- Server Driven Content Negotiation
- Accept-Encoding, User Agent, Accept-Language, Authorization, Cookie
- Cache-Control header
- stale-while-revalidate
- asyncでcacheの検証をしている間はcacheを返してよい → 速度〇
- stale-if-error
- origin serverに接続できなかったときに,stale cacheを返してよい秒数
- stale-while-revalidate
- media typeの指定
- media type: data format
- Content-Type @response
- MIME: Multipurpose Internet Mail Extensions
- top level type name/ sub type name [; parameter]
- top level type: text/image/video/applicationなど
- sub type: 具体的なdata format
- top level type name/ sub type name [; parameter]
- 前提知識なくても読めればtext, そうでなければapplication
- MIME: Multipurpose Internet Mail Extensions
- 正しいmedia typeをContent-Typeで返す
- x-で始まるmedia type
- IANA(Internet Assigned Numbers Authority)に登録されていないもの
- application/x-www-form-urlencodedだけ例外的に登録されている
- IANA(Internet Assigned Numbers Authority)に登録されていないもの
- 自分でmedia typeを定義する
- Registration treeで接頭辞が決まっている
- vnd.を使うことが多い
- Registration treeで接頭辞が決まっている
- JSONやXMLを用いた新しいdata形式を定義する場合
- 独自に別のHTTP headerを用意するのが折衷案として〇
- media typeが正しくないと,security riskあり
- media type @request
- 同一生成元policy(Same Origin Policy)とCross-Origin Resource Sharing
- 独自のHTTP headerを定義する
- 接頭辞: X-
- X-は不要という論もある
- まとめ
- [Good] HTTPの仕様を最大限利用し,独自仕様の利用を最低限に止める
- [Good] 適切なstatus codeを用いる
- [Good] 適切な,なるべく一般的なmedia typeを返す
- [Good] Clientが適切なcacheを行えるように情報を返す
Ch05 設計変更をしやすいWeb APIを作る
- 設計変更のしやすさのimportance
- 影響が分かりづらい
- 外部/mobile/web serviceいずれの場合も問題あり
- web service,自分のserviceで使っているAPIであれば,問題は小さいが,cacheの問題はある
- APIをversionで管理する
- versionを変えるときの指針
- security, authorityにアップデートは,後方互換なしで〇
- 以降のバージョンアップの影響を小さくするために実施する
- 常に最新版を返すaliasは不要
- APIの提供を終了する
- 終了日時の周知
- Blackout Test
- 予め提供終了時の仕様を盛り込む
- 強制アップデート,ユーザのOSの調査
- 利用規約にサポート期限を明記
- applicationの性質による
- Orchestration layer
- LSUDs: one-size-fits-all(OSFA)
- OSFAではなく,それぞれのClientに対応するために,ServerとClientの間にOrchestration layerを挟むようにする.
- まとめ
Ch06 堅牢なWeb APIを作る
- 安全性と安定性
- Web APIを安全にする
- riskのe.g.
- Server-Client間での情報の不正入手
- browserでアクセスするAPIの問題
- browserは汎用的で機能が豊富
- XSS
- XSRF: Cross Site Request Forgery
- Forgery: 偽造,捏造
- 回避方法
- methodを正しく使う
- XSRF tokenを使う
- X-Request-With
- JSON hijack
- 回避方法
- JSONをSCRIPT要素では読み込めないようにする
- X-Requested-With
- XMLHttpRequest, browser以外からのClientからのアクセスのみを想定の場合は,必ずやる
- X-Requested-With
- JSONをbrowserが必ずJSONと認識するようにする
- 正しいmedia typeを返す
- JSONをJavaScriptとして解釈不能,または実行時にデータを読み込めないようにする
- JSONをSCRIPT要素では読み込めないようにする
- 回避方法
- browserからのアクセスを想定しないAPIでは,browserからのSCRIPT要素を使ったアクセスを防ぐのが〇
- 悪意あるaccessへの対策
- security関係のHTTP header
- 大量accessへの対策
- まとめ