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

このように生成されたトークンは、HTMLHTTPの仕組みの中で簡単に取り扱うことができる。

使用

ユーザーがサーバにログインを行う場合、従来のセッションによる認証では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クレーム自体を廃止すべきだと主張している。

署名アルゴリズムの脆弱性については、以下のような方法で対策が可能である。

  1. JWTヘッダーだけを見て検証しない。
  2. アルゴリズムについて知る。
  3. 適切なキーサイズを用いる。

出典

外部リンク

Uses material from the Wikipedia article JSON Web Token, released under the CC BY-SA 4.0 license.