GRADUATION
JWT の中と、その危うさが見えるようになりました。
JWT を3つの部品に分解し、中身が誰でも読めること、署名だけが改ざんを止めていること、そしてその署名の検証を甘くする実装(alg:none・alg 混同・弱い鍵)の危うさを、自分で作ったトークンで確かめました。
おつかれさまでした。
持ち帰るもの
- JWT は暗号化ではないヘッダとペイロードは base64url でエンコードされているだけ。誰でもデコードして読めます。秘密を入れる場所ではありません。
- 署名だけが、改ざんを止めているペイロードを書き換えても、正しい署名を作れなければ検証は落ちます。逆に、検証を甘くする実装は、この唯一の砦を無効にします。
- 検証は厳格にalg はサーバが固定する(トークンの言い分を信じない)。鍵は十分に長くランダムに。この2つで、既知の JWT 攻撃の多くが塞がります。
次にやるといいこと
- JWT は認証・セッションの一部です。「認証とセッションの診断」で、Cookie・セッション・CSRF・OAuth と合わせた全体像を扱います。
- トークンを検証する側のコードを読む目は、sec-audit のソースコード診断で活きます。