FreeStyleWiki

JWT

このエントリーをはてなブックマークに追加

[セキュリティ]

JWT

これを読んだ

JWT を使ってみよう

  • 何?: Json Web Token
  • どんな感じ
    • JSONを含む
    • URL上で扱える
      • Base64ベースなのでURLに使用しても大丈夫という意味
    • 署名ができる
  • 検証
    • トークンには電子署名があるので改竄検知可能

  JWTの詳細を知る

以降は、以下の書籍を参考に読んだメモ(全体を読んでいるわけではないので注意)

Introduction to JSON Web Tokens

JWTの中身

JWTのトークンの中身はbase64で作られた文字列で、中身はJSONになっている

Notice the dots separating the three elements of the JWT (in order: the header, the payload, and the signature).

JTTトークンのドットはJWTの3要素を区切ることをお知らせしておきます(順に、ヘッダ・ペイロード、そしてシグネチャ)

// ヘッダ
$ echo "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9" | base64 -d
{"alg":"HS256","typ":"JWT"}

// ペイロード
$ echo "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9" | base64 -d
{"sub":"1234567890","name":"John Doe","admin":true}

3要素目のシグネチャは名前の通り(電子)署名の文字列なのでデコードはできず、検証のためだけに使われる。

上記のJWTの中身は以下のサイトで検証して遊ぶことができる。https://jwt.io/

  JWT + OpenID Connect

OpenID Connect defines several flows which return data in different ways. Some of this data may

be in JWT format.

OpenID Connectのいくつかのフローで使用されるデータがJWTになりうるということ。

認可コードフロー

• Authorization flow: the client requests an authorization code to the authorization endpoint (/authorize).

This code can be used againt the token endpoint (/token) to request an ID token (in JWT format),

an access token or a refresh token.

  • 上記Qiitaのページの認可コードフロー。部分にあたるもの
    • 認可サーバから返却されるアクセストークン、レフレッシュトークンがJWTを使うことができるという話

認可エンドポイントに認可リクエストを投げ、応答として短命の認可コードを受けとり、その認可コードをトークンエンドポイントでアクセストークンと交換するフローです。

インプリジットフロー

• Implicit flow: the client requests tokens directly from the authorization endpoint (/authorize).

The tokens are specified in the request. If an ID token is requested, is is returned in JWT format.

  • 上記Qiitaのページのインプリジットフロー。部分にあたるもの
    • 認可エンドポイントに認可リクエストを投げ、応答として直接アクセストークンを受け取るフローです。
      • 要は、認可コード部分のフローがあるものが認可コードフロー、無ければインプリジットフロー

インプリシットフローではリフレッシュトークンは発行されません。

Implicitフロー

ImplicitはネイティブアプリやJavaScriptのようなブラウザー上で動作するクライアントに最適化され、アクセストークン取得のフローも簡略化されています。

クライアント側で動作するため、セキュリティー上リフレッシュトークンはサポートされず、

アクセストークンの有効期限が切れるたびにブラウザーのセッションのチェックを行い、アクセストークンの再発行を行います。

ImplicitフローはWebAPIアクセスに必要となるアクセストークンがブラウザーに直接渡されてしまうことや、

アクセストークンに紐づいているユーザーを認可されたユーザーとして扱ってしまうためIDトークンの検証を推奨します。

ハイブリッドフロー

• Hybrid flow: the client requests both an authorization code and certain tokens from the authorization

endpoint (/authorize). If an ID token is requested, it is returned in JWT format.

If an ID token is not requested at this step,

it may later by requested directly from the token endpoint (/token)

特に重要そうではないため、省略する

  JWT詳細