如何确保来自我的 Elastic Beanstalk REST API 应用程序的 CloudFront returns cookie

How do I ensure CloudFront returns cookies from my Elastic Beanstalk REST API application

我在 AWS Elastic Beanstalk 中部署了一个 Java Spring 用于 REST API 的启动应用程序。它是 HTTP 而不是 HTTPS。

我们称它为http://foobar.elasticbeanstalk.com/api

我正在使用 AWS CloudFront 分发来终止 HTTPS,但不缓存任何内容(我已将我的缓存策略设置为“Managed-CachingDisabled”。

我们称它为https://dfoobar123.cloudfront.net

有些 API 要求客户端“登录”。有一个调用 /login 导致在响应 cookie 中返回 ACCESS_TOKEN。后续调用必须包含该访问令牌才能成功。

直接上app就可以了。当我转到 http://foobar.elasticbeanstalk.com/api/login(直接使用 Elastic Beanstalk 应用程序)时,服务器让我登录并 returns cookie。

但是,当我转到 CloudFrontDistribution https://dfoobar123.cloudfront.net/api/login 时,我可以看到服务器正在对我进行身份验证,但我没有在响应中取回 cookie headers。

我需要在 CloudFront 中打开什么设置才能启用此功能?

您需要在缓存行为中转发cookie。没有它,CloudFront 将从响应中删除 Set-Cookie header。

这是documentation

You can configure each cache behavior to do one of the following:

...

Don’t forward cookies to your origin – CloudFront doesn’t cache your objects based on cookie sent by the viewer. In addition, CloudFront removes cookies before forwarding requests to your origin, and removes Set-Cookie headers from responses before returning responses to your viewers.

Cookie 被阻止默认

让它们工作需要在行为设置中进行两项更改:

  1. 允许 cookie 通过(根据请求)
  2. Set-Cookie header 返回(带有响应)

在哪里更改 cookie 设置...

迷茫?如果是,那么...

这是 step-by-step 过程...

在您的 CloudFront 分配中:

  1. 转到行为 选项卡
  2. Select 行为并单击 编辑
  3. 找到缓存键和源请求部分
  4. 源请求策略下点击创建策略
  5. 填写 Name,然后滚动到底部并将 CookiesNone 更改为All(或 Include Specified Cookes,如果你想列入白名单)
  6. 点击创建保存新政策
  7. 切换回原始选项卡(使用 编辑行为 页面)
  8. 再次找到缓存键和原始请求部分
  9. 响应header政策下,点击创建政策
  10. 填写名称,然后滚动到底部
  11. 自定义 headers 下,点击 添加 header 按钮
  12. 名称字段中输入Set-Cookie
  13. Value 留空,Origin override 应保持未选中状态
  14. 点击创建按钮
  15. 返回编辑行为页面,点击刷新按钮,这样您就可以选择这两个新策略
  16. 点击保存更改并花几分钟时间进行部署