JWT
JSON Web Token
「ジョット」と読む
RFC7519
website
JWTのフォーマット
参考
/mrsekut-book-4798159298/491 (11.2 JWT)
この節はJWTの概要という感じ
JWSやJWAには触れていない
#WIP
https://scgajge12.hatenablog.com/entry/jwt_security
セキュリティ
https://moneyforward.com/engineers_blog/2020/09/15/jwt/
攻撃して学ぶJWT
https://ja.wikipedia.org/wiki/JSON_Web_Token
概要
「JWTとは何か」から調べ始めるのがおかしいmrsekut.icon
認可とは何か、認証とは何かを知って、
どういう操作を通して目的を果たすのか知った上で、
途中でJWTを使用するんだな、と理解したほうが良い
#??
JWSとJWEの2種類のJWTがあるのはなぜ
署名したいならばJWSを使う
header.payload.signature
暗号化したいならばJWEを使う
header.encryptedKey.initVector.crphertext.authTag
署名も暗号化もしたい時は?
Nested JWT
デジタル署名のできる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を共有する必要がない
/mrsekut-book-4798159298/490
https://jwt.io/#debugger
JWTの仕組み
https://webbibouroku.com/Blog/Article/jwt
https://techblog.yahoo.co.jp/advent-calendar-2017/jwt/
https://www.wakuwakubank.com/posts/523-it-jwt/
https://qiita.com/ono_matope/items/938a98fb111a297b68b9
JWS
ユースケース
https://qiita.com/kaiinui/items/21ec7cc8a1130a1a103a#ユースケース
https://dev.classmethod.jp/articles/json-signing-jws-jwt-usecase/
認証、認可
1. クライアントが認証サーバーに、トークンの請求
リクエストに認証情報(ex. userId, pass)をのせる
これってログインのタイミングの1回だけ #??
2. 認証サーバーは認証情報が正しいことを確認し、秘密鍵を使ってデジタル署名されたJWTを発行する
このJWTにuserId, expiration_dateを含む
3. クライアントは以降のリクエストでJWTを付与してやりとりをする
サーバー側は秘密鍵を使ってJWTの検証をし、userIdをJWTから取り出して処理を行う
JWTの内容が改竄されていたとしても、サーバー側に「許容するid」の情報があるので安心安全
OAuthのトークンとして
メール認証のトークンとして
パスワード忘れメール送付時のトークンとして
etc.
クライアントではどこに保存するか
webの場合はlocal strageっぽい
https://auth0.com/blog/secure-your-react-and-redux-app-with-jwt-authentication/
https://qiita.com/nabeliwo/items/ac4b77324a9989e8e6bb
https://jasonwatmore.com/post/2017/12/07/react-redux-jwt-authentication-tutorial-example
ReactNativeの場合は?
AsyncStorage?
解説記事
https://medium.com/@njwest/building-a-react-native-jwt-client-api-requests-and-asyncstorage-d1a20ab60cf4
jwk-to-pem
https://github.com/Brightspace/node-jwk-to-pem
jsonwebtoken
https://github.com/auth0/node-jsonwebtoken
https://www.npmjs.com/package/jsonwebtoken
#??
Authorization Headerにそのまま書くの?
参考
JSON Web Token の効用 - Qiita
https://ja.wikipedia.org/wiki/JSON_Web_Token
https://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c
https://christina04.hatenablog.com/entry/2016/06/07/123000
https://ritou.hatenablog.com/entry/2019/12/01/060000
https://zenn.dev/ritou/articles/4a5d6597a5f250