| 略語 | JWT |
|---|---|
| 状態 | 提案された標準 |
| 初版 | 2010年12月28日 |
| 最新バージョン | RFC 7519 2015年5月 |
| 組織 | 国際電気通信連合 |
| 委員会 | IEGS について |
| 著者 |
|
| 基本基準 |
|
| ドメイン | データ交換 |
| Webサイト | datatracker.ietf.org/doc/html/rfc7519 |
JSON Web Token(JWT、推奨発音は/ dʒɒt /、単語「jot」と同じ[1])は、ペイロードにいくつかのクレームを主張するJSONを保持し、オプションの署名および/またはオプションの暗号化を使用してデータを作成するための提案されたインターネット標準です。トークンは、秘密鍵または公開/秘密鍵を使用して署名されます。
たとえば、サーバーは「管理者としてログイン」というクレームを持つトークンを生成し、それをクライアントに提供できます。クライアントは、そのトークンを使用して、管理者としてログインしていることを証明できます。トークンは、一方の当事者の秘密鍵 (通常はサーバーの秘密鍵) で署名できるため、その後はどの当事者もトークンが正当であるかどうかを確認できます。もう一方の当事者が、適切で信頼できる手段によって対応する公開鍵を所有している場合、彼らもトークンの正当性を確認できます。トークンは、特にWeb ブラウザーのシングル サインオン(SSO) コンテキストで、コンパクトで[2] URLセーフで[3]使用可能になるように設計されています。JWT クレームは通常、認証されたユーザーの ID をID プロバイダーとサービス プロバイダーの間で渡すために、またはビジネス プロセスで必要なその他のタイプのクレームに使用できます。[4] [5]
JWTはJSONベースの他の標準であるJSON Web SignatureとJSON Web Encryptionに依存しています。[1] [6] [7]
構造
- ヘッダ
- 署名の生成に使用されるアルゴリズムを識別します。以下の例では、
HS256このトークンが HMAC-SHA256 を使用して署名されていることを示しています。
- 使用される典型的な暗号化アルゴリズムは、SHA-256(HS256)を使用したHMACとSHA-256(RS256)を使用したRSA署名です。JWA(JSON Webアルゴリズム)RFC 7518では、認証と暗号化の両方についてさらに多くのアルゴリズムが導入されています。[8]
{ "alg" : "HS256" 、"typ" : "JWT" }
- ペイロード
- クレームのセットが含まれます。JWT仕様では、トークンに一般的に含まれる標準フィールドである7つの登録クレーム名が定義されています。[1]トークンの目的に応じて、カスタムクレームも通常含まれます。
- この例には、標準の Issued At Time クレーム (
iat) とカスタム クレーム (loggedInAs) があります。 { "loggedInAs" : "管理者" 、"iat" : 1422779638 }
- サイン
- トークンを安全に検証します。署名は、Base64url エンコーディング RFC 4648 を使用してヘッダーとペイロードをエンコードし、ピリオド区切りで 2 つを連結することによって計算されます。次に、その文字列は、ヘッダーで指定された暗号化アルゴリズムにかけられます。この例では、共有シークレットを使用した HMAC-SHA256 を使用します (公開キー アルゴリズムも定義されています)。Base64urlエンコーディングはbase64に似ていますが、英数字以外の異なる文字を使用し、パディングを省略します。
HMAC_SHA256 ( シークレット、base64urlEncoding (ヘッダー) + '.' + base64urlEncoding (ペイロード) )
3 つの部分はBase64url エンコーディング RFC 4648 を使用して個別にエンコードされ、ピリオドを使用して連結されて JWT が生成されます。
const token = base64urlEncoding (ヘッダー) + '.' + base64urlEncoding (ペイロード) + '.' + base64urlEncoding (署名)
上記のデータと「secretkey」のシークレットによりトークンが作成されます。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN
_oWnFSRgCzcmJmMjLiuyu5CSpyHI=
(上記の json 文字列は、改行やスペースなしで、utf-8 バイト配列にフォーマットされています。データのわずかな変更でも結果のトークンに影響するため、これは重要です)
生成されたトークンはHTMLやHTTPに簡単に渡すことができます。[3]
使用
認証では、ユーザーが正常にログインすると、JSON Web Token (JWT) が返されることがよくあります。このトークンは、HTTP 専用の Cookieなどの安全なメカニズムを使用してクライアントに送信する必要があります。ローカル ストレージやセッション ストレージなどのブラウザー ストレージ メカニズムにJWT をローカルに保存することは推奨されません。これは、クライアント側で実行されている JavaScript (ブラウザー拡張機能を含む) がこれらのストレージ メカニズムにアクセスして、JWT を公開し、セキュリティを侵害する可能性があるためです。無人プロセスの場合、クライアントは、事前共有シークレットを使用して独自の JWT を生成して署名し、次のようにOAuth準拠のサービスに渡すことで直接認証することもできます。
POST /oauth2/token
コンテンツタイプ: application / x-www-form-urlencoded
grant_type = urn:ietf:params:oauth:grant-type:jwt-bearer & assertion = eyJhb...
クライアントが有効な JWT アサーションを渡すと、サーバーはアプリケーションへの呼び出しに有効な access_token を生成し、それをクライアントに返します。
{
"access_token" : "eyJhb..." 、"token_type" : "Bearer" 、"expires_in" : 3600 }
クライアントが保護されたルートまたはリソースにアクセスする場合、ユーザー エージェントは通常、スキーマを使用してAuthorization HTTP ヘッダーBearerで JWT を送信する必要があります。ヘッダーの内容は次のようになります。
承認: Bearer eyJhbGci ...<snip>... yu5CSpyHI
これはステートレス認証メカニズムであり、ユーザーの状態はサーバー メモリに保存されません。サーバーの保護されたルートは Authorization ヘッダーに有効な JWT があるかどうかを確認し、存在する場合は、ユーザーは保護されたリソースにアクセスできます。JWT は自己完結型であるため、必要な情報はすべてそこにあり、データベースを複数回クエリする必要性が減ります。
標準フィールド
実装
JWT 実装は、以下を含む多くの言語とフレームワークに存在します (ただし、これらに限定されません)。
脆弱性
JSONウェブトークンにはセッション状態が含まれる場合があります。しかし、プロジェクトの要件でJWTの有効期限が切れる前にセッションを無効にすることが許可されている場合、サービスはトークンのみによるトークンアサーションを信頼できなくなります。トークンに保存されているセッションが取り消されていないことを検証するには、トークンアサーションをデータストアに対してチェックする必要があります。これにより、トークンはステートレスではなくなり、JWTの主な利点が損なわれます。[36]
セキュリティコンサルタントのティム・マクリーン氏は、一部のJWTライブラリに脆弱性があると報告した。この脆弱性は、algトークンを誤って検証するためにフィールドを使用しており、最もよくあるのはalg=noneトークンを受け入れることである。これらの脆弱性は修正されたが、マクリーン氏はalg同様の実装の混乱を防ぐために、このフィールドを完全に廃止することを提案した。[10]それでも、新しいalg=none脆弱性は依然として発見されており、2018年から2021年の間に4つのCVEが提出され、この原因となっている。[37] [より良い情報源が必要]
適切な設計により、開発者は予防策を講じてアルゴリズムの脆弱性に対処することができる: [38] [39]
- JWTヘッダーだけで検証を行わない
- アルゴリズムを知る(
alg分野だけに依存しないようにする) - 適切なキーサイズを使用する
2017年にいくつかのJWTライブラリが無効な楕円曲線攻撃に対して脆弱であることが判明しました。[40]
JSONウェブトークンは、標準で利用可能な暗号化アルゴリズムやオプションが多数あるため安全に使用するのが難しく、ウェブフロントエンド[41]とバックエンド[42]の両方で代替の標準を使用するべきだと主張する人もいます。
参照
- APIキー
- アクセストークン
- 基本アクセス認証
- ダイジェストアクセス認証
- クレームベースのアイデンティティ
- HTTP ヘッダー
- 簡潔なバイナリオブジェクト表現 ( CBOR )
参考文献
- ^ abcd Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (2015 年 5 月). JSON Web Token (JWT). IETF . doi : 10.17487/RFC7519 . ISSN 2070-1721. RFC 7519.
- ^ Nickel, Jochen (2016)。Microsoft Azure による ID およびアクセス管理の習得。Packt Publishing。p. 84。ISBN 9781785887888. 2018年7月20日閲覧。
- ^ ab 「JWT.IO - JSON Web Tokens 入門」。jwt.io。2018年7 月 20 日閲覧。
- ^ セビリア、クリス。 「JSON Web トークンの構造」。2015 年5 月 8 日に取得。
- ^ 「Atlassian Connect ドキュメント」。developer.atlassian.com。2015年5 月 18 日時点のオリジナルよりアーカイブ。2015 年5 月 8 日閲覧。
- ^ Jones, Michael B.; Bradley, John; Sakimura, Nat (2015 年 5 月). 「draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)」. tools.ietf.org . 2015 年5 月 8 日閲覧。
- ^ Jones, Michael B.; Hildebrand, Joe (2015 年 5 月). 「draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)」. tools.ietf.org . 2015 年5 月 8 日閲覧。
- ^ Jones, Michael B. (2015 年 5 月). 「draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)」. tools.ietf.org . 2015 年5 月 8 日閲覧。
- ^ Jones, Michael B.; Bradley, Bradley; Sakimura, Sakimura (2015 年 5 月). 「exp (有効期限) クレーム」. JSON Web Token (JWT). IETF . sec. 4.1.4. doi : 10.17487/RFC7519 . ISSN 2070-1721. RFC 7519.
- ^ ab McLean, Tim (2015 年 3 月 31 日). 「JSON Web Token ライブラリの重大な脆弱性」. Auth0 . 2016 年3 月 29 日閲覧。
- ^ github.comの jwt-dotnet
- ^ github.comの libjwt
- ^ "liquidz/clj-jwt". GitHub . 2018年5月7日閲覧。
- ^ cljwt on github.com
- ^ github.comの JustJWT
- ^ “bryanjos/joken”. GitHub . 2018年5月7日閲覧。
- ^ "golang-jwt/jwt". GitHub . 2018年1月8日閲覧。
- ^ 「jose: JSON Object Signing and Encryption (JOSE) と JSON Web Token (JWT) ライブラリ」。Hackage 。2022年12月25日閲覧。
- ^ github.comの auth0/java-jwt
- ^ 「kjur/jsrsasign」。GitHub 。 2018年5月7日閲覧。
- ^ 「SkyLothar/lua-resty-jwt」。GitHub 。 2018年5月7日閲覧。
- ^ "jsonwebtoken". npm . 2018年5月7日閲覧。
- ^ github.comの ocaml-jwt
- ^ cpan.orgの Crypt::JWT
- ^ github.comの lcobucci/jwt
- ^ Egan, Morten (2019 年 2 月 7 日)、GitHub - morten-egan/jwt_ninja: PLSQL による JSON Web トークンの実装。、2019 年3 月 14 日取得
- ^ “SP3269/posh-jwt”. GitHub . 2018年8月1日閲覧。
- ^ "jpadilla/pyjwt". GitHub . 2017年3月21日閲覧。
- ^ pkgs.racket-lang.org の net-jwt
- ^ github.comの JSON-WebToken
- ^ github.comの ruby-jwt
- ^ github.comの jsonwebtoken
- ^ github.comの rust-jwt
- ^ github.comの jwt-scala
- ^ [1] github.comより
- ^ スルートウェグ、スヴェン。 「セッションに JWT を使用するのをやめてください。」joepie91 とりとめのない話。2018 年8 月 1 日に取得。
- ^ 「CVE - 検索結果」。cve.mitre.org。
- ^ 「一般的な JWT セキュリティ脆弱性とその回避方法」 。2018年5 月 14 日閲覧。
- ^ Andreas, Happe. 「JWT: 署名 vs MAC 攻撃」. snikt.net . 2019 年5 月 27 日閲覧。
- ^ 「JSON Web Encryption における重大な脆弱性」。Auth0 - ブログ。2023年10 月 14 日閲覧。
- ^ 「No Way, JOSE! Javascript オブジェクトの署名と暗号化は、誰もが避けるべき悪い標準です - Paragon Initiative Enterprises ブログ」。paragonie.com。2023年10月 13 日閲覧。
- ^ 「JWT 認証の落とし穴」。authzed.com。2023年11 月 16 日閲覧。
- RFC 7519
- jwt.io – Auth0 が管理する、ツールとドキュメントを備えた JWT に関する専門 Web サイト
