最新の Web アプリケーションを開発する場合、最も一般的な認証方法の 1 つは、JSON Web トークン (JWT) を使用することです。 JWT は強力ですが、安全に実装されていない場合、アプリケーションがさまざまなリスクにさらされる可能性があります。このブログでは、JWT に関して開発者が直面する一般的な落とし穴 (追記: 私もそれに直面しました。..) と、アプリケーション全体のセキュリティを確保するためのベスト プラクティスを詳しく説明します。
JWT は、2 者間で情報を JSON オブジェクトとして安全に送信する方法を定義するオープン標準 (RFC 7519) です。ステートレス システムでの認証に最もよく使用されます。
JWT は 3 つの部分で構成されます:
さあ、www.jwt.io をチェックしてください
JWT のシンプルさと強力さにもかかわらず、不適切な JWT 実装は重大なセキュリティ脆弱性を引き起こす可能性があります。ここでは私が陥りがちな落とし穴と改善方法をいくつか紹介します。
落とし穴: 多くの開発者は、そのシンプルさから JWT をローカル ストレージに保存しますが、このアプローチは XSS (クロスサイト スクリプティング) 攻撃に対して脆弱です。つまり、ハッカーがブラウザを通じてそのトークンを簡単に盗み、次のようなポーズをとらせる可能性があります。本物のユーザーとして。
解決策: ローカル ストレージの代わりに、JWT を HTTP 専用 Cookie に保存します。これらの Cookie は JavaScript からアクセスできないため、ハッカーの生活が少し難しくなります。
落とし穴: 有効期限を設定せずに JWT を作成すると、ユーザーがログアウトした後やトークンが侵害された場合でも、JWT は無期限に使用できます。
解決策: ペイロードには必ず有効期限 (exp) クレームを設定します。適切な有効期限を設定すると、ユーザーは定期的にトークンを更新する必要が生じ、トークンの誤用の可能性が減少します。
var token = jwt.sign({email_id:'123@gmail.com'}, "Stack", { expiresIn: '3d' // expires in 3 days });
落とし穴: これは私が今でも忘れがちな非常によくある間違いです。JWT ペイロードは Base64 でエンコードされていますが、暗号化されていません。機密情報 (パスワードや秘密キーなど) が保存されています。ペイロード内の は、鍵がなくても誰でも簡単に読み取ることができます!
解決策: 常に、ユーザーのロールや ID など、機密性や重要性の低い情報のみを JWT ペイロードに保存します。機密データを送信する必要がある場合は、トークン ペイロード全体を暗号化してください。
落とし穴: JWT は本質的にステートレスであるため、トークンの取り消し (ログアウト後など) は難しい場合があります。これを処理するデフォルトの方法はないため、カスタム ソリューションが必要になります。適切に取り消さないと、JWT は期限が切れるまで有効なままとなり、ユーザーごとに複数の JWT を同時にアクティブにすることができます。
解決策: トークン ブラックリストを実装するか、リフレッシュ トークンを使用します。ログアウト時にトークンをブラックリストに保存し、サーバーがリクエストごとにブラックリストを確認するようにします。あるいは、有効期間の短いアクセス トークンをリフレッシュ トークンと組み合わせて使用し、より頻繁に再認証を強制します。
JWT はステートレス認証のための優れたツールですが、セキュリティ リスクの導入を避けるために慎重に扱う必要があります。よくある落とし穴を避け、コーディングのベストプラクティスに従うことで、安全な認証システムを作成する方法を学び、初心者としてこれらすべての問題に直面しました。
これらの手順を実行すると、アプリケーションのセキュリティが向上するだけでなく、開発の世界で非常に求められているスキルである安全なトークン管理についての深い理解が実証されます。
以上がJWT 認証を安全に処理する: 落とし穴とベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。