JWTの各要素をパースする処理を自前で書いていたときに、ちょっと詰まってしまったので備忘録として記述しておく。
結論
- Base64エンコードとBase64URLエンコードは異なるものである。
- JWTのヘッダ、ペイロード、署名はそれぞれBase64URLエンコードされているものなので、取り出すにはBase64URLデコードしないとダメ。
- Goならば
base64.RawStdEncoding.DecodeString
関数を使う。
- Goならば
Base64エンコードとBase64URLエンコード
要約すると以下の違いあり。
Base64エンコード
A-Z, a-z, 0-9, +, /
しか扱うことができない通信環境において、元のデータをこれらの文字にエンコードする方式。
パディング文字として=
が使われる。
主にEメール、Basic認証、インターネット掲示板で使われる。
Base64URLエンコード
URLでは+, -
は特別な意味をもつため、Base64エンコード済み文字列の中でこれらに相当する文字はそれぞれ-,_
に変換して扱う方式。
パディングもしない。
Go標準パッケージでのエンコード・デコード
- 普通のBase64エンコード、デコード:
base64.StdEncoding
を使用する - Base64URLエンコード、デコード:
base64.RawURLEncoding
を使用する
参考