JWT(JSON Web Token)
参考URL
JWTハンドブック(今度読む)
JWS,JWE,JWKなどの仕様について詳しい
SPAで使うことの懸念
JWTとは
JWTとは、JSON形式で表現されたクレーム (claim) の集合を、JWS
もしくは JWE
に埋め込んだもの。
JWTではシンプルにトークンの形式のみが規定されておりpayload部分のフォーマットやトークン自身の使われ方についてはほとんど言及していない。
言及しているのがOpenID Connect。
JWTはJSONベースのデータを暗号化して作られる文字列で認証や認可のための仕組みとして利用される。
属性情報(Claim: クレーム)をJSONデータ構造で表現したトークンの仕様。
JSONを使ったコンパクトでurl-safeなクレームの表現方法であり、OAuth2やOpenID Connectなんかで使われます。
通常のトークン認証との違い
通常のトークン形式の認証では、トークンの正当性を確認するためにサーバへの問い合わせが必要。
→これはサーバの負荷を増やし、通信の遅延を引き起こす可能性があります。
一方、JWT(JSON Web Token)では、公開鍵を利用してクライアント側でトークンの正当性を確認できる。
JWTは署名されており、その署名を検証することでトークンの改ざんや不正使用を検知できる。
公開鍵は事前にサーバからクライアントに配信され、クライアントはそれを使ってトークンを検証します。これにより、サーバへの問い合わせが不要になり、認証処理が効率的に行えるという利点があります。
また、JWTはトークン自体にユーザの情報や許可権限などのデータを含めることができるため、サーバへの再度の問い合わせを必要とせず、トークン自体に必要な情報が含まれているため、スケーラビリティとパフォーマンスの向上にも寄与します。
総合的に言えば、JWTは通常のトークン認証よりもセキュアで効率的な認証手法と言えます。
通常のトークン形式の認証ではトークンの正当性を確認するためにサーバへの問い合わせが必要。 JWTでは公開鍵を利用してクライアント側でトークンの正当性を確認できるという特徴がある。 トークンはオフラインで正当性が保証されるため、逆に一度発行 したトークンが困難であるというデメリットも存在します。
また通常のトークンがそれ自体ではまったく意味を持たないケースがほとんどであるのに対し、JWTはそれ自体が情報を持つトークン。 このためJWTの内部に個人情報などを含めることは推奨されない。
JWT発行側は秘密鍵を使う
JWTの発行側は秘密鍵(シークレットキー)を使用してトークンを署名する。
秘密鍵はサーバ側で厳重に管理されるべきであり、第三者に漏洩しないようにする必要がある。
JWTの署名は、発行側が秘密鍵を使用してトークンに署名し、その署名はトークン自体に含まれます。
この署名を検証するために、トークンの受け取り側は公開鍵(または共有の鍵)を使用します。公開鍵は信頼できるサーバから提供され、署名の検証に使用されます。
秘密鍵を保持することで、トークンの署名を検証することが可能。
もしトークンが改ざんされた場合、署名の検証が失敗し、トークンは無効と見なされます。
この秘密鍵による署名と検証の仕組みにより、JWTは信頼性の高い認証手段となります。ただし、秘密鍵の保管や管理には注意が必要であり、不正なアクセスから保護するために適切なセキュリティ対策が必要です。
OpenID ConnectでのJWT
OpenID ConnectとJWT の関わり - Oauth2.0 との違いなど
OpenID Connectで規程されるID Tokenは、JWTのpayload部に一定のフォーマットを提供するもの。 また、ID Tokenを利用した認証フローの流れなどトークンの利用方法についても細かい規定を追加していまする
特徴
署名・暗号化でき、URL-safeであることが挙げられる
JWT歴史
JWTでは
- 署名付きデータの場合はJWS
- 暗号化する場合はJWE の仕様に基づき、JWTが利用されますが、現状使われている多くのJWTが署名付きのものである
JWT認証メリット
JWT認証のメリットはその実装のシンプルさと、ステートレスなことにある。
現実的にはDB参照とか必要になったりする(一時トークンを保存するテーブル)が、JWT認証の場合改ざん検証だけで済むのは魅力的。