🦈

【速習】JWT・JOSE

2023/06/08に公開

はじめに

JWTに関して勉強していたところ、外コン出身者でもびっくりの謎の略称が大量に出てきたため、その備忘録。
詳しい解説は多数あるので、ここでは分かりやすく端的に表現しています。
詳細で正確な情報に関してはRFCなどの参考文献を参照してください。

JWT : Json Web Token

JSON形式のデータをHTTPヘッダーや、URLクエリに付加できる形にすることを目的とし、
ヘッダーとペイロードをBase64urlエンコードによりURLセーフな形にした文字列のこと。

JWT自体は上記を定義したもので、署名機能や暗号化機能はJWS、JWEという別のRFCで定義されている。
JWTはJWS、JWE、またはその両方によってエンコードされるために署名機能や暗号化機能を持つ。

https://tex2e.github.io/rfc-translater/html/rfc7519.html

JOSE : JSON Object Signing and Encryption

JSON Object Signing and Encryptionの略。
JSONを利用したデータ転送用の規格群のことで、以下の3つを基本として定義する。

  1. JWS: 整合性保護されたオブジェクト形式
  2. JWE: 機密保護されたオブジェクト形式
  3. JWK: キーを表現するためのフォーマット

https://tex2e.github.io/rfc-translater/html/rfc7165.html

JWS : JSON Web Signature

発行者と改ざんに関する整合性を保証するオブジェクト形式。

ヘッダー、ペイロード、署名の3ブロックによって成り立ち、
Base64では <ヘッダー>.<ペイロード>.<署名> という形式となる。

ヘッダー
暗号化に関する設定やキーを記述する
ペイロード
内容に関する記述
署名
ヘッダーとペイロードの情報をもとに生成された署名

JWT(JWS)の生成と確認

生成

  1. ヘッダーに形式や暗号化に関する設定を書き込む
  2. ペイロードにJWTの発行時刻や利用者情報などを書き込む
  3. Base64urlエンコードし、署名なしトークンを生成: <ヘッダー>.<ペイロード>
  4. 署名なしトークンに対して、秘密鍵とHMAC-SHA256を用いて署名を生成
  5. 署名をBase64エンコードして、出来上がり!!  <ヘッダー>.<ペイロード>.<署名>

確認

  1. 署名をデコードし、公開鍵を使用して復号する。
  2. <ヘッダー>.<ペイロード> と復号した値を比較して同じなら整合!

JWE : JSON Web Encryption

JWT、JWSの内容を暗号化することにより、機密保護を行うためのフォーマット。
以下の記事が参考になる。というか見てください。。
https://qiita.com/ono_matope/items/938a98fb111a297b68b9

JWEについて調査すると、いくつか脆弱性が指摘されるとの内容が見られる。
以下のQiitaでは2020年時点では脆弱性が解決されたかの調査をしている。
使用する際にはある程度のサーベイと判断が必要か。
https://qiita.com/reoring/items/149aaa47053ffcb9482d

https://tex2e.github.io/rfc-translater/html/rfc7516.html

JWK : JSON Web Key

暗号鍵(公開鍵)をJSON形式で配布するためのフォーマット
JWSのヘッダーに鍵の識別士kidを付加することでJWKsのどの公開鍵に対応するかを示す。

https://tex2e.github.io/rfc-translater/html/rfc7517.html

実装方法

以下の記事がわかりやすかった。
が、スクラッチは脆弱性のもと。基本的にはライブラリや認証系サービスを使用しましょう。
https://qiita.com/knaot0/items/8427918564400968bd2b

https://qiita.com/soicchi/items/b8c87a3f2f384b3d06ff

参考文献

JWTについて

https://dev.classmethod.jp/articles/amazon-api-gateway-jwt-authorizers/

https://qiita.com/knaot0/items/8427918564400968bd2b

https://qiita.com/soicchi/items/b8c87a3f2f384b3d06ff

https://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c

JOSEについて

https://fintan.jp/page/1572/#:~:text=Javascript Object Signing and Encryption,を目的としています。

https://qiita.com/ono_matope/items/938a98fb111a297b68b9

https://zenn.dev/yuki0920/articles/e232350b066a03

https://qiita.com/TakahikoKawasaki/items/1c1bcf24b46ebd2030f5

実装

https://qiita.com/shu-yusa/items/36855cf1e9b4ec2adf28

https://qiita.com/bobunderson/items/d48f89e2b3e6ad9f9c4c

https://qiita.com/KWS_0901/items/9b37712ed4bff75e1d4f

https://blog.serverworks.co.jp/api_gateway-cognito-client_credentials_grant

Discussion