こんにちは、プレイライフの熊﨑です。
最近一番幸せだった時は、サウナに入った後水風呂に入って、全裸で外気浴を行っていた時ですw
そんなサウナにハマりつつある私が本日は、jwtについて今現在自分がわかっていることをまとめてみました。
jwtとは?
jsonデータに署名や暗号化を施す方法を定めたものです。
主に認証用のトークンなどで用いられます。
どんな構成?
ヘッダー・ペイロード・署名の3つで構成されています。
ヘッダー
ヘッダーは通常、2つの部分で構成されています。1つはトークンのタイプ(JWT)、もう1つは使用されている署名アルゴリズム(HMAC SHA256やRSAなど)です。
署名アルゴリズムは、JWT文字列の暗号化に用いられるアルゴリズムのことを指しています。
{
"alg": "HS256",
"typ": "JWT"
}
ペイロード
ペイロードには以下のようなuserの認証情報などが格納されています。
{
"id": "1",
"name": "John Doe",
"admin": true
}
署名
トークン検証用の署名。
トークン内のヘッダーやペイロードを用いているためトークンの中身が途中で変更されていないことを確認できます。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
// secret: 秘密鍵
// HMACSHA256: 暗号化アルゴリズムの1種
// headerの中身とpayloadの中身をbase64エンコーディングして、ピリオドでつなげた後に秘密鍵とHMACSHA256を使って、署名を作成する
どんな時に使用されるのか?
認証
ユーザーがログインすると、その後の各リクエストにトークンが含まれ、そのトークンで許可されたルート、サービス、リソースにアクセスできるようになります。
イメージとしては、旅行者がパスポートを発行(ここがログイン処理でトークンを発行するところ)してもらい、そのパスポートを使用して、世界各国に行ける。というものだと思います。
情報交換
jwtは公開鍵と秘密鍵を用いて署名することができるため、送信者に公開鍵を使ってもらい、自身の秘密鍵で復号することができるため、情報を交換するときにも使用できます。
jwtのメリット
Cookieでの認証を行う際はサーバ側でsession情報を保持しております。そしてCookieにはsessionIdを入れており、リクエストの都度sessionIdに紐づくサーバ側sessionデータを参照しています。そのsessionIDを元にDBからsession情報を取得する処理が必要になります。
一方で、jwtの場合は署名の検証処理だけですむというところが利点にあります。
また、ステートレスなため、サーバ資源をすぐに開放できるという利点があり、利用者や負荷に応じて性能や機能を向上させられます。
jwtのデメリット
個々のJWTトークンを無効にすることはできないということがあります。その気になればいつでもサーバーが無効にできるセッションとは異なり、個々のステートレスJWTトークンは無効にできません。侵害を検出した後に攻撃者のセッションを無効にすることはできないということです。
まとめ
- jwtはヘッダー・ペイロード・署名の3つから構成される。
- jwtは認証や情報交換の際に使用される。
- jwtはcookie認証に比べて処理が早くスケーラブル。
- 一方で、個々人のトークンを無効にすることができないことから、セキュリティ面に懸念が残る。
メリットとデメリットをもっと深掘りして、どのような認証形式を使うか選択する必要がありそうですね、、、
参考文献
https://jwt.io/introduction
http://cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions/
https://qiita.com/doyaaaaaken/items/02357c2ebca994160804