generated at
JWT
JSON Web Token
「ジョット」と読む




参考
この節はJWTの概要という感じ
JWSやJWAには触れていない



セキュリティ
攻撃して学ぶJWT
概要


「JWTとは何か」から調べ始めるのがおかしいmrsekut
認可とは何か、認証とは何かを知って、
どういう操作を通して目的を果たすのか知った上で、
途中でJWTを使用するんだな、と理解したほうが良い




署名したいならばJWSを使う
header.payload.signature
暗号化したいならばJWEを使う
header.encryptedKey.initVector.crphertext.authTag
署名も暗号化もしたい時は?


デジタル署名のできるJSONを含んだURL SafeなToken
実際のデータは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)をのせる
これってログインのタイミングの1回だけ #??
2. 認証サーバーは認証情報が正しいことを確認し、秘密鍵を使ってデジタル署名されたJWTを発行する
このJWTに userId , expiration_date を含む
3. クライアントは以降のリクエストでJWTを付与してやりとりをする
サーバー側は秘密鍵を使ってJWTの検証をし、 userId をJWTから取り出して処理を行う
JWTの内容が改竄されていたとしても、サーバー側に「許容するid」の情報があるので安心安全
OAuthのトークンとして
メール認証のトークンとして
パスワード忘れメール送付時のトークンとして
etc.

クライアントではどこに保存するか
webの場合はlocal strageっぽい
ReactNativeの場合は?
AsyncStorage?
解説記事





Authorization Headerにそのまま書くの?

参考