我正在尝试在Next.js前端和Rails API后端之间实现身份验证,并且很难理解如何正确安全地执行此操作。
我在rails端使用了jwt-sessions gem,它在登录时会返回access_token
,a refresh_token
和csrf
令牌。在csrf
只能通过报头被发送,并且需要对所有非GET或HEAD的请求。的access
和refresh
可以通过报头中给定的或由饼干。
我可以实现后端,以返回JSON响应中的所有令牌,或设置cookie,或同时使用两者。
问题是,在客户端,我看不到存储这些令牌的真正方法,即:
- 安全
- 在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)?