JSON Web Token

JSON Web Token（ジェイソン・ウェブ・トークン）は、JSONデータに署名や暗号化を施す方法を定めたオープン標準 (RFC 7519) である。略称はJWT。 JWTでは、トークン内に任意の情報（クレーム）を保持することが可能であり、例えばサーバはクライアントに対して「管理者としてログイン済」という情報を含んだトークンを生成することができる。クライアントはそのトークンを、自身が管理者としてログイン済であることの証明に使用することができる。トークンは当事者の一方（通常はサーバ）または両方（もう一方は公開鍵を提供する）の秘密鍵により署名されており、発行されたトークンが正規のものか確認することができる。 JWTのトークンはコンパクトな設計となっており、またURLセーフであり、特にウェブブラウザでシングルサインオン (SSO) を行う場合に使いやすくなっている。トークンには一般的に認証プロバイダ（英語版）やサービスプロバイダが認証したユーザー識別情報が格納される他、各々のサービスで必要な情報も格納される。 JWTは他のJSONベースのオープン標準であるJSON Web Signature（英語版） (JWS, RFC 7515) とJSON Web Encryption（英語版） (JWE, RFC 7516) に拠って立っている。 JWTのトークンは以下の3つの要素から構成される。 これら3つの要素は、Base64urlエンコーディングされた上で、ピリオドにより結合される。以下にコード例を示す。 const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature) 上記データは、秘密鍵が"secretkey"の場合、以下のようなトークンとなる。 eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI このように生成されたトークンは、HTMLとHTTPの仕組みの中で簡単に取り扱うことができる。 ユーザーがサーバにログインを行う場合、従来のセッションによる認証ではCookieにてセッションIDが返されるが、JWTにおいてはトークンが返され、それをローカルに保存して利用する（主にlocal storageやsession storage（英語版）が用いられる。セッションIDのようにCookieを用いる場合もある）。 ユーザーが認証が必要な機能やリソースにアクセスする際、クライアントはトークンを何らかの手段、主としてAuthorizationヘッダーでBearerスキーマを用いてサーバに送信する。この場合、Authorizationヘッダーは以下のような形式となる。 Authorization: Bearer eyJhbGci...(中略)...yu5CSpyHI JWTは、サーバ上に認証状態を保持しないステートレスな認証方式である。サーバはAuthorizationヘッダーで渡されたトークンが正しいかだけを検証し、アクセスを許可する。JWTにおいては、認証に必要な情報は全てトークン内に格納されており、データベースへの問い合わせを削減することができる。 RFCにおいては、ペイロードに含める以下のような標準フィールド（クレーム）が定義されている。 また、ヘッダーには以下のフィールドが使用可能である。 JWTはステートレスであることから、JWT単体ではトークンを無効にすることが出来ない。従来のセッション同様、サーバに状態を保持すれば可能だが、その場合ステートレスの利点は失われる。 セキュリティコンサルタントのTim McLeanは、複数のJWTライブラリがalgクレームに署名無し (none) 等を指定した不正なトークンを処理してしまう脆弱性を報告した。これらの脆弱性は修正されたが、McLeanは同様の問題を防ぐためalgクレーム自体を廃止すべきだと主張している。 署名アルゴリズムの脆弱性については、以下のような方法で対策が可能である。 JWTヘッダーだけを見て検証しない。 アルゴリズムについて知る。 適切なキーサイズを用いる。 ^ Nickel, Jochen (2016). Mastering Identity and Access Management with Microsoft Azure. p. 84. ISBN 9781785887888. https://books.google.com/books?id=Q4dcDgAAQBAJ&pg=PA84&dq=jwt+smaller+saml&hl=en&sa=X&ved=0ahUKEwiWouXcu67cAhUSJt8KHV0UD2IQ6AEINzAC#v=onepage&q=jwt%20smaller%20saml&f=false 2018年7月20日閲覧。  ^ a b “JWT.IO - JSON Web Tokens Introduction”. jwt.io. 2018年7月20日閲覧。 ^ Sevilleja, Chris. “The Anatomy of a JSON Web Token”. 2015年5月8日閲覧。 ^ “Atlassian Connect Documentation”. developer.atlassian.com. 2015年5月8日閲覧。 ^ “draft-ietf-oauth-json-web-token-32 - JSON Web Token (JWT)”. tools.ietf.org. 2015年5月8日閲覧。 ^ a b “draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)”. tools.ietf.org. 2015年5月8日閲覧。 ^ a b “draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)”. tools.ietf.org. 2015年5月8日閲覧。 ^ “draft-ietf-jose-json-web-algorithms-40 - JSON Web Algorithms (JWA)”. tools.ietf.org. 2015年5月8日閲覧。 ^ a b John, Bradley. “JSON Web Token (JWT)”. tools.ietf.org. 2016年11月14日閲覧。 ^ John, Bradley,. “JSON Web Token (JWT)” (英語). tools.ietf.org. 2017年12月20日閲覧。 ^ a b McLean, Tim (2015年3月31日). “Critical vulnerabilities in JSON Web Token libraries”. Auth0. 2016年3月29日閲覧。 ^ “Stop using JWT for sessions”. joepie91 Ramblings. 2018年8月1日閲覧。 ^ “Common JWT security vulnerabilities and how to avoid them” (英語). 2018年5月14日閲覧。 jwt.io（英語） - Auth0によるJWT特設サイト JSON Validator（英語） – JWTのバリデート OpenID Foundation Japan - JSON Web Token (JWT) - RFC 7519ドラフト版の日本語訳 RFC 8725 JSON Web Token Best Current Practices