Cloudfront が JSON Web Token による認証を妨害

Cloudfront が JSON Web Token による認証を妨害

短いバージョン: Cloudfront の背後にあるドメインを指している場合、私の jwt トークンは更新されません。

これをここに投稿するのが最適か、それとも stackoverflow に投稿するのが最適かはわかりませんが、問題を AWS Cloudfront に特定できたと思うので、ここから始めようと思いました。


私の設定:

  • Route 53 DNS設定はCloudfrontディストリビューションを指す
  • 1 Cloudfrontの動作はapi/*トラフィックを取得し、ノード/エクスプレスアプリをホストするELB EC2インスタンスに送信します。
  • 1 Cloudfrontの動作はデフォルトのトラフィックを取得し、Vueシングルページアプリのファイルが存在するs3バケットに送信します。
  • Node/Express アプリは、JWT 戦略による認証に Passport.js を使用しています。
    • エラスティックビーンズトーク

ローカルでは、すべてが完璧です。ステージング サイトで実行し、プロファイル ページにアクセスすると、すべてのユーザー データが適切なフィールドに入力されます。ページを更新すると、JWT トークンで何かが起こり、すべてのユーザー データが失われます。これは、認証の背後にある他のページでも発生しています。

API 呼び出しをステージング (CloudFront の背後にある) にポイントする代わりに、API を ec2 インスタンスに直接ポイントするようにしたところ、すべてが完璧に機能しました。

それで、問題が Cloudfront に限定されている場合、JWT トークンが毎回正常に渡されるようにするには、何を行う必要がありますか (特定のヘッダーを転送する必要がありますか)?

答え1

JWT をヘッダーで送信している場合、想定は正しいので、CloudFront にヘッダーをオリジンに転送するように指示する必要があります。これは、Cache Based on Selected Request Headersキャッシュ動作のオプションを次のいずれかの値に変更することで実現できます。

  • すべて。これにより、すべてのヘッダーが送信元に転送されます。
  • ホワイトリスト。次に、JWT を送信するために使用するヘッダー名を追加できます (最も一般的なのは Authorization)。

このオプションには 2 つの機能があることに注意してください。

  1. 特定のヘッダーまたはすべてのヘッダーをオリジンに転送する
  2. これらのヘッダーに基づいてオブジェクトをキャッシュします。

これがキャッシュの動作にどのような影響を与えるか理解してください。詳細については、リクエストヘッダーに基づいてコンテンツをキャッシュする

キャッシュ動作で設定できる別のオプションがあり、私はほぼ常にこれを使用します: Object Caching。オブジェクト キャッシュをUse Origin Cache Headersこのように設定すると、アプリケーションが応答キャッシュを制御できます。この設定は、オリジン (S3/ALB/EC2) やCache Based on Selected Request Headers値に基づいて使用可能または使用できない場合があります。

これが役に立つことを願っています。

関連情報