こんばんは、ritouです。
久々の投稿な気がしますが、今回はOAuth 2.0のリソースアクセス時の設計の話です。
ずーっと前から書こうと思いつつ書いてなかったので、ここに書いておきます。
出てくる用語や仕様は、下記の翻訳リンクを参照してください。
よくある実装 : Access Tokenに一見ランダムな文字列を利用、DBなりで紐付け
パフォーマンスとか無視して素直に実装しようとするとこんな感じになるのではないでしょうか?
認可サーバー
- 認可情報を(DBなどに)保存 : user_id, client_id, scope, 有効期限など
- Access Tokenはランダムっぽい文字列を利用して、それらと紐付けられる
リソースサーバー
- Access Tokenの文字列を利用してDB接続や認可サーバーへのHTTPリクエスト、その他いろいろな手段でAccess Tokenに紐づく情報を問い合わせる : Access Tokenが有効であることを確認
認可サーバーにHTTPなどで問い合わせる感じだと、こんな図になるでしょう。
この場合、基本的に受け取ったAccess Tokenに対して全て問い合わせが走るので、どうしても負荷がきつくなりがちでしょう。
無駄な問い合わせを省略するためには、Access Tokenにタイムスタンプ含めるとか、文字列のフォーマットをチェックするとかはできるかもしれませんが、規模が大きくなると辛いのかなと思ったりします。
メリット/デメリット
メリット
- リソースサーバーは無効なAccess Tokenを署名検証 + 有効期限チェックである程度判定できる
- DBや認可サーバーも、token_idの管理だけできればいいので負荷が抑えられる
Access TokenのPayloadサンプル
JWTのPayloadに含む最低限の値はこんな感じかと。token_idなんかはHeaderでも良いかも。
3文字ルールの中にtoken_idとかscopeとか入れるの気持ち悪かったら何でも良いですし、構造化されててもかまわないと思います。
{ "sub": "(リソースオーナーのユーザー識別子)", "token_id": "(認可情報 or Access Tokenに対して一意な識別子)", "aud": "(client_id)", "exp": (有効期限のタイムスタンプ), "scope": "(このAccess Tokenに関連付けられたScope)" }
まとめ
参考になりそうな資料
- JICS 2013 講演資料 : Mobage Open Platform の歴史とIdentity 関連技術について : Session CookieにJWTを利用する件について触れられている
- 10 Things You Should Know about Tokens
ではまた。