[セキュリティ]
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になりうるということ。
- OAuth 2.0 全フローの図解と動画
- このページがフロー名称とRFCが紐ついていて網羅的である
認可コードフロー
• 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はネイティブアプリや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)
特に重要そうではないため、省略する