JWT
JSON Web Token
「ジョット」と読む
参考
この節はJWTの概要という感じ
JWSやJWAには触れていない
セキュリティ
攻撃して学ぶJWT
概要
「JWTとは何か」から調べ始めるのがおかしいmrsekut.icon
認可とは何か、認証とは何かを知って、
どういう操作を通して目的を果たすのか知った上で、
途中でJWTを使用するんだな、と理解したほうが良い
署名したいならばJWSを使う
header.payload.signature
暗号化したいならばJWEを使う
header.encryptedKey.initVector.crphertext.authTag
署名も暗号化もしたい時は?
実際のデータはJSON文字列
JSONをtokenとして扱っている
JSONに電子署名をして、URL-safeな文字列として表現したもの
改竄されたかどうかの検証が可能
発行者だけが鍵を使ってトークンが正しいことを検証出来る
暗号化ではないので、JSON の中身は誰でも見ることができる
JSON の変更は出来ない
JWTにuserIdを含んだ場合
JWTを見れば、そこからuserIdを取り出すことができる
しかし、userId部分だけ適当に入れ替えてなりすますことはできない
なぜならJWTは改竄の検証ができるから
登場人物が3人の時
User
Auth Server
Client = Protected Resource
Auth Server → User → Clientという風にJWTを渡せば、
Auth ServerとClientが直接遣り取りをする必要なくコミュニケーションを取れる
JWTに必要な情報を全て詰め込んで置けるのでDBと共有したりする必要もない
Auth ServerとProtected Resourceの間でDBを共有する必要がない
JWTの仕組み
ユースケース
1. クライアントが認証サーバーに、トークンの請求
リクエストに認証情報(ex. userId, pass)をのせる
2. 認証サーバーは認証情報が正しいことを確認し、秘密鍵を使ってデジタル署名されたJWTを発行する このJWTにuserId, expiration_dateを含む
3. クライアントは以降のリクエストでJWTを付与してやりとりをする
サーバー側は秘密鍵を使ってJWTの検証をし、userIdをJWTから取り出して処理を行う
JWTの内容が改竄されていたとしても、サーバー側に「許容するid」の情報があるので安心安全
パスワード忘れメール送付時のトークンとして
etc.
クライアントではどこに保存するか
webの場合はlocal strageっぽい
ReactNativeの場合は?
AsyncStorage?
解説記事
参考