JWT
JSON Web Token
RFC7519
JWEとかJWSとかの仲間からなる
JWTそれ自体には暗号化や署名・検証は組み込まれておらず、JWEやJWSに移譲している
JWTが定めるのは:
「署名に使われたアルゴリズムはなにか」
「暗号化されているか、その鍵スイートはなにか」
「上記メタデータ (ヘッダと呼ぶ) やペイロードの符号化とどんなレイアウトか」
{base64_encode(header)}.{base64_encode(payload)}.{base64_encode(sign(header + payload))} という形式の文字列になる
URL-safeなBase64符号化を行うのでHTTPヘッダやCookie, URLのクエリパラメータなどで扱いやすい可搬性が売りというわけ
algにJWEによる暗号化がなされる形式を指定しないとペイロードは平文なので注意
脆弱性チャンス algをnoneに改竄されたり許容すると署名の検証がなされず、ペイロードが改竄されるリスクがあるので受け入れ alg は必ず指定しよう
https://oauth.jp/blog/2015/03/16/common-jws-implementation-vulnerability/
最近のライブラリだと noneは特別なパラメータを渡さない限り許可しなかったりするが、仕様上、許可されていることは知っておくべき
ライブラリでケアしている例: Crypt::JWTのallow_none (default:false)
実装
Perl
https://github.com/DCIT/perl-Crypt-JWT
Node
https://github.com/auth0/node-jsonwebtoken
JWTのみでJWEに対応していないので、暗号化が必要な時は使えない
おすすめ: https://github.com/panva/jose