ぼくのかんがえたさいきょうのAPI管理(JWT)
環境
サーバからAPIを叩いてjsonを取ってくるWEBシステム
フロントはJavaScript,jQuery,Riotで組まれている。
認証サーバとAPIサーバが同一(マシンもIPもシステムも)
問題点
JWTにjsonはbase64でエンコードされたものであり、暗号化はされていない。
実装によるがLocalStorageに値を入れる事が多いが、LocalStorageはJSから自由に読み込む事が可能なためXSSにより任意のJSが実行された場合は容易にAccess Tokenを盗む事ができる。
※改ざんされないだけであり、盗まれるたものを利用される恐れはある。
(セッションハイジャック)
解決案
XSS,CSRF対策がしてあるのは大前提
- Access TokenをCookieに格納して"HTTP Only"と"Secure"フラグを付ける。
- Access Tokenやセッショントークンは一定時間ごとに更新される。(30分等)
機構
1. ログイン時にサーバからクライアントに以下の3つを渡す。
クライアント側
value name | store place | expire | element | Desc |
---|---|---|---|---|
Access Token | Session Storage | 30m | user_num,token用乱数 | 必ずJWT |
Local Key | Local Storage | 30d | user_num,expire,key用乱数 | コストが気になれば通常のjsonでも可 |
Cookie Key | Cookie | LocalStorage Keyと同じ期間 | user_num,key用乱数 | HTTPOnly,Secure(コストが気になれば通常のjsonでも可) |
※ user_num : user_id
と1対1になる乱数(JWTの内容は暗号化されないのでuser_idそのままはまずい)
DB
value name | Desc |
---|---|
User ID | ログイン時に使うid |
User Num | user_idの代わりにjsonへ含める乱数値 |
Refresh Hash | Sessionが切れた場合に新規Access Tokenを発行する場合の検証につかうHash値 |
Salt | 上記ハッシュを生成する際に使ったソルト値 |
サーバ側(内部変数)
value name |
---|
Access Token |
User Num |
Local Key |
Cookie Key |
※Refresh Hash
の生成方法
-
Local Key
+Cookie key
をハッシュ化する。 -
1のハッシュ
+ソルト
をハッシュ化する。
2.通常(画面遷移なし)利用時
フロントエンド側は定期的にサーバと通信を行っているものとする。
- クライアントは
Access Token
をサーバへ送信する。(Cookie key
も勝手に送られるけどきにしない。) - サーバは送られてきた
Access Token
と内部変数のAccess Token
が一致するかを検証する。異なればログインページへリダイレクトする。 - 一定時間(30分)毎に
Access Token
,Local Key
,Cookie Key
の3つともクライアントへ送信する。クライアントはそれぞれを格納する。(※この段階ではLocal Key
とCookie Key
は内部変数で保持しているのみで、Refresh Hash
は生成・保存されていない。) - クライアントとのセッションが切れた段階でサーバは
Local Key
とCookie Key
を使いサーバはRefresh Hash
を生成し、DBへ保存する。
3.ブラウザやタブを閉じた後、再開時
Access Token
はSession Storage
に入っているため、ブラウザを閉じたりタブを閉じれば消えてしまうため再度Access Tokenを取得する必要がある。
- クライアントはサーバに対して
Local Key
とCookie key
を送信する。 - サーバはKeyの検証を行う。
- クライアントから送らてきた
Local Key
,Cookie key
が改竄されていないかJWTのチェックをする。※KeyがJWTの時のみ -
Local Key
,Cookie key
とDBにあるソルトを使いRefresh Hash
を生成する。(1のRefresh Hash
の生成方法を参照) -
1のRefresh Hash
とDBのRefresh Hash
を突き合わせる。 - 一致すれば新規の
Access Token
を発行する。異なれば ログイン画面へリダイレクトする。
- クライアントから送らてきた
- サーバはクライアントに
Access Token
,Local Key
,Cookie Key
を送信する。 - クライアントは新規の3つをそれぞれ格納する。
4.その他
- JWTのjsonが改ざんされていた場合
-
Access Token
がなくLocal Key
,Cookie key
もない場合 -
Local Key
,Cookie key
の期限が切れている
これらはすべてログイン画面へリダイレクトさせる。
Author And Source
この問題について(ぼくのかんがえたさいきょうのAPI管理(JWT)), 我々は、より多くの情報をここで見つけました https://qiita.com/forestsource/items/77f83735ea897e4ebb8b著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .