我正在创建一个应用程序,其中:
为此,我决定使用AWS Cognito并实施Oauth 2.0流程。
现在,当用户尝试访问/ hello时,他们将被重定向到AWS Cognito登录页面。用户登录后,我的服务器端应用程序(包含REST API / hello)可以从AWS Cognito获取id_token和access_token。
我应该将此id_token传递给浏览器,并要求浏览器在访问/ hello REST API时将其发送吗?这对安全性有影响吗?这是正确的方法吗?
或者,在对用户进行身份验证之后,我应该创建一个新的id_token(由我自己的自定义密钥签名),然后将其发送到浏览器吗?用户将在尝试访问/ hello REST API时将其发送回去。然后,我将使用自定义密钥验证id_token是否有效。
id_token的目的是验证用户的会话是否有效并且尚未过期。是否应将id_token用于会话管理?
因此,目标是避免在React Web UI中使用cookie,而应使用具有无状态后端的令牌。我完全同意这个目标。
OPTION 1
将令牌从Web后端传递到UI,UI可以使用它们来维护客户端会话。这需要通过Ajax调用的Spring端点,并且需要通过cookie对其进行保护。否则,攻击者可以呼叫该端点并获取令牌。
OPTION 2
通过oidc client library而不是Spring Web后端在React应用中进行OAuth登录处理,因此您的UI是纯cookieless SPA。仅将Spring用作OAuth保护的资源服务器。可以通过AWS Cloudfront对HTML / JS文件使用静态内容托管。
我的解决方案
[如果对选项2感兴趣,我有一个演示React应用程序,它可以像这样工作并连接到Cognito。您可以从我的Quick Start Page上自己运行它。
这里是SPA OAuth Code。同时,我的Spring Sample仅充当Rest API,不进行任何Web登录处理。