1. ホーム
  2. authentication

[解決済み】JWTが盗まれたらどうする?

2022-04-18 13:03:14

質問

RESTful APIのために、JWTによるステートレス認証を実装しようとしています。

AFAIKでは、JWTは基本的に、REST呼び出し中にHTTPヘッダーとして渡される暗号化された文字列です。

しかし、もし盗聴者がいて、そのリクエストを見て トークンを盗む ? そして、彼は私のアイデンティティでリクエストを偽造することができるのでしょうか?

実は、この懸念はすべての トークンベース認証 .

それを防ぐには?HTTPSのような安全なチャンネル?

解決方法は?

私は、認証をかなり深く扱うノード・ライブラリの作者です。 express-stormpath ということで、ここで少し情報を提供させていただきます。

まず、JWTは通常 NOT は暗号化されています。JWTを暗号化する方法はありますが(参照。 JWEs ) が、多くの理由から、実際にはあまり一般的ではありません。

次に、(JWTを使うかどうかにかかわらず)どのような形式の認証も、MitM攻撃(man-in-the-middle)の対象になります。この攻撃は、あなたがインターネット上でリクエストを行う際に、攻撃者があなたのネットワークトラフィックを見ることができる場合に起こります。これは、あなたのISPやNSAなどが見ることができるものです。

SSLは、認証の際に、コンピュータからサーバーまでのネットワークトラフィックを暗号化することで、ネットワークトラフィックを監視している第三者が、サーバーの秘密SSL鍵のコピーを入手できない限り、トークン、パスワード、その他を見ることができないようにしています(可能性は低いです)。このような理由から、SSLはあらゆる形式の認証に必須なのです。

しかし、誰かがあなたのSSLを悪用して、あなたのトークンを見ることができたとしましょう。 はい 攻撃者は 意志 は、そのトークンを使ってあなたになりすまし、あなたのサーバーにリクエストをすることができるようになります。

さて、ここからがプロトコルの出番です。

JWTは、認証トークンの1つの規格に過ぎません。JWTはほとんど何にでも使用できます。JWTがクールなのは、そこに余分な情報を埋め込むことができ、誰もそれをいじっていないことを検証できる(署名)ためです。

しかし、JWTそのものは「セキュリティ」とは何の関係もない。どこから見ても、JWTはAPIキーとほぼ同じもので、どこかのサーバーに対して認証するために使うランダムな文字列に過ぎません。

あなたの質問がより興味深いのは、使用されているプロトコル(おそらくOAuth2)です。

OAuth2の仕組みは、クライアントに短期間だけ認証用の一時的なトークン(JWTのようなもの!)を与えるために設計されています。

トークンが盗まれても、攻撃者は短期間しか使えないということです。

OAuth2では、ユーザー名とパスワード、またはAPIの認証情報を入力してサーバーと再認証を行い、それと引き換えにトークンを取得する必要があります。

このプロセスは時々行われるため、トークンは頻繁に変更され、攻撃者は多大な労力をかけずに常にあなたになりすますことが難しくなります。

お役に立てれば幸いです^^。