概要
今回は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を利用した認証機構について調べたいと思います。
最後まで読んでいただきありがとうございました!
参考