如何使用Next.js和Rails后端安全地存储JWT?

我正在尝试在Next.js前端和Rails API后端之间实现身份验证,并且很难理解如何正确安全地执行此操作

在rails端使用了jwt-sessions gem,它在登录时会返回access_token,a refresh_tokencsrf令牌。csrf只能通过报头被发送,并且需要对所有非GET或HEAD的请求。accessrefresh可以通过报头中给定的由饼干。

我可以实现后端,以返回JSON响应中的所有令牌,或设置cookie,或同时使用两者。

问题是,在客户端,我看不到存储这些令牌的真正方法,即:

  1. 安全
  2. 在SSR和浏览器中均可用

这是我看到的选项

选项1:服务器设置的HTTPOnly Cookie

这就是jwt-sessions宝石的建议。将CSRF保留在localStorage中,但将其他令牌保留在服务器设置的httpOnly cookie中。

这似乎是最安全的方法,但是SSR via getInitialProps根本无法使用,因为它无法通过发送Cookie fetch我什至无法手动发送它们,因为在JS中看不到它们。

选项2:非httpOnly Cookie

这就是官方的下一个示例似乎所做的(尽管只有一个可能是无状态的令牌)

服务器或浏览器都可以设置没有 httpOnly 的cookie

我可以通过SSR访问它,但这不使我对XSS开放吗?

选项3:使用浏览器存储

Just put all the tokens in localStorage and/or sessionStorage. This seems to be the worst option, as it won't work in SSR, and to my knowledge is not secure.

????

Am I missing something? Is non-httpOnly, like in the official example, OK? Is there a better approach? Or will I have to ignore SSR (and thus one of Next.js's killer features)?