安全なJWT実装のベストプラクティス
本番アプリケーションでJWTを安全に保存、ローテーション、失効させます。
「安全なJWT実装のベストプラクティス」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
基本原則
JWTの安全性は、実装の安全性にかかっています。仕様には柔軟性があり、その柔軟性が脆弱性を生みます。本番システムで認証バイパスにつながってきた一般的な落とし穴を避けるため、以下のベストプラクティスに従ってください。
アルゴリズムの固定
想定するアルゴリズムを必ず明示的に指定してください: jwt.decode(token, key, algorithms=["RS256"])。検証鍵やコードパスを選択するために、トークンヘッダーからアルゴリズムを読み取らないでください。これにより、alg=none攻撃と鍵混同攻撃を防止できます。
短い有効期限とリフレッシュトークン
アクセストークン: 15~60分。リフレッシュトークン: 7~30日間、httpOnly Cookie(localStorageではなく)に保存します。期限が切れると、クライアントはリフレッシュトークンを使って認証サーバーから新しいアクセストークンを取得するため、再認証は必要ありません。
オーディエンスと発行者の検証
aud(オーディエンス)を検証し、トークンが別のサービスではなく自分のサービス向けに発行されたことを確認します。iss(発行者)が認証サーバーのURLと一致することを検証します。これらのチェックがないと、同じ鍵で署名された別のアプリのトークンも受け入れてしまいます。
トークンの保存
アクセストークンはメモリ(JS変数)に保存し、タブを閉じたときに消去します。リフレッシュトークンはhttpOnly、Secure、SameSite=Strict Cookieに保存し、JavaScriptからアクセスできないようにします。JWTをlocalStorageに保存してはいけません。XSSによって盗まれる可能性があります。
失効戦略
JWTはステートレスであり、組み込みの失効機能はありません。選択肢としては、各リクエストでチェックする失効リスト(denylist)を管理する、非常に短い有効期限を設定する、高セキュリティの用途では中央照会を行うオペークトークンを使用する、といった方法があります。
鍵のローテーション
署名鍵を定期的にローテーションしてください。JWKSには、異なるkid値を持つ複数の鍵を公開します。ローテーション中は、新しいkidで新しいトークンを発行し、古いトークンが期限切れになるまで古い鍵を有効なままにして、その後JWKSから古い鍵を削除します。
ペイロード内の機密データ
機密データ(パスワード、SSN、クレジットカード情報)をJWTペイロードに決して入れないでください。JWTはbase64urlでエンコードされているだけで、暗号化されていません。暗号化されたクレームが必要な場合はJWE(JSON Web Encryption)を使用するか、機密データをサーバー側に保持してください。
HTTPSのみ
JWTはHTTPS経由でのみ送信してください。HTTP経由で傍受されたJWTは、認証を完全にバイパスするために使われます。CookieにはSecureフラグを設定してください。プロトコルのダウングレードを防ぐためにHSTSを使用してください。サーバーログに完全なJWT文字列を決して記録しないでください。
ライブラリの選定
十分に保守されているライブラリを使用してください: PyJWT 2+、python-jose、auth0/node-jsonwebtoken 9+、Nimbus JOSE + JWT(Java)。JWTの検証をゼロから実装することは避けてください。ライブラリの脆弱性について、CVEデータベースを定期的に確認してください。
テスト
すべての攻撃ベクトルをテストしてください: alg=noneトークン、RS256→HS256の混同トークン、期限切れトークン、誤ったaudienceのトークン、改ざんされたペイロードを送信します。jwt.ioを使ってテストトークンを作成してください。これらが401で拒否されることを検証する統合テストを追加してください。
確認問題
Webアプリケーションでは、リフレッシュトークンをどこに保存すべきでしょうか。
まとめ
JWTを安全に使用するには、アルゴリズムの固定、アクセストークンの短い有効期限、リフレッシュトークンのhttpOnly Cookieへの保存、オーディエンスと発行者の検証、鍵のローテーションが必要です。次は、暗号学的な秘密分散方式について学びます。
よくある質問
「安全なJWT実装のベストプラクティス」レッスンは無料ですか?
はい。「安全なJWT実装のベストプラクティス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「安全なJWT実装のベストプラクティス」で何を学びますか?
本番アプリケーションでJWTを安全に保存、ローテーション、失効させます。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「安全なJWT実装のベストプラクティス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JWTの構造:ヘッダー、ペイロード、署名
- HS256とRS256:対称鍵JWTと非対称鍵JWT
- JWTの脆弱性:alg=noneと鍵の取り違え
- 安全なJWT実装のベストプラクティス