概要
今回はJWTとJWSについて自分の中でうまく説明できないことに気づき、改めて仕組み等を調べたのでアウトプットとしてこちらに記載していきたいと思います!
JWTとは
まず、JWTとはJSON Web Tokenの略でよく認証などに用いられる仕組みです。
先に言っておくとJWTは、それ自体が認証について何か規定しているわけではなく認証を行う際に利用される仕組みに過ぎません。
なのでJWT=認証ではないということは気に留めておいた方がいいかもしれません。
ではJWTは何をするのか?
JWTは何をするのか
JWTの役割は制約のあるHTTPヘッダやクエリパラメータにJSONデータをうまく付与できるようにすることです。
主に役割は2つあります。
- JSONデータをURLセーフ(Base64URLでエンコード)にする
- JSONデータをコンパクトにする
1. データをURLセーフにする
URLセーフとはURLとして正常に使用できる文字列にするということです。
たとえば、?、=、&などのようなものは、パラメータなどに解釈されてしまうので
そうならないようにBase64URLエンコードし、文字列として解釈してもらえるようにします。
2. データをコンパクトにする
これはJSONデータのクレーム名を省略することでデータを小さくすることです。
クレーム名とはJSONデータのキーとなる部分のことを指し、下記のようなものがあります。
| クレーム名 | 説明 |
|---|---|
| expiration | JWTの有効期限 |
| issuer | JWTの発行者 |
| ... | ... |
他にもたくさんあるので詳しく知りたい方は下記を参照してください。
実際に下記のようなものをデータのクレーム名を省略してデータを形成します。
{
"issuer": "sample.jwt",
"expiration": 1670085336,
...
}
省略後
{
"iss": "sample.jwt",
"exp": 1670085336,
...
}
JSONデータをBase64URLでエンコード
最終的にJSONデータを下記の図のようにエンコードしてJWT生成されます。
JWSとは
JWSとはJSON Web Signatureの略でJWTが本物か、もしくは中身が改ざんされていないかを検証する仕組みのことです。
JWTはJSONデータをBase64URLでエンコードしたデータのことでした。
しかし、デコードしデータの中身を変更し再度エンコードすれば簡単に中身を改ざんできてしまいます。
それを防ぐためにJWSという仕組みがあります。
ではJWSは何をするのか?
JWSは何をするのか
結論、暗号鍵を利用して最終的にヘッダ.ペイロード.シグニチャで形成された文字列を生成します。
先ほど出てきたJWTが真ん中に入る形になっています。
流れとしては下記になります。
なお今回は秘密鍵方式を前提としてます。
1. ヘッダをBase64URLでエンコード
2. JWTをBase64URLでエンコード
3. エンコードしたヘッダとJWTをヘッダの`alg`で指定されているアルゴリズムを利用して暗号鍵によって暗号化
4. 暗号化したシグニチャをBase64URLでエンコード
5. 各エンコードした値を`.`で繋ぐ
ちなみにヘッダのalgは必須です。
algは暗号化を行う際のアルゴリズムを指定しており、
これがないとどのアルゴリズム利用して暗号化されたかわからず検証することができません。
検証の流れ
検証の流れはJWS生成の逆を行うことでできます。
流れとしては下記です。
1. JWSのシグニチャ部分をBase64URLでデコードする
2. デコードしたものを暗号鍵で復号化
3. 復号化したものとJWS内のヘッダとJWTを比較し検証
まとめ
いかがだったでしょうか。
今回調べたことでJWTと認証がごっちゃになっていたのが解決しました。
次はJWTを利用した認証機構について調べたいと思います。
最後まで読んでいただきありがとうございました!
参考


