我正在尝试在Next.js前端和Rails API后端之间实现身份验证,并且很难理解如何正确安全地执行此操作。
我在rails端使用了jwt-sessions gem,它在登录时会返回access_token
,a refresh_token
和csrf
令牌。在csrf
只能通过报头被发送,并且需要对所有非GET或HEAD的请求。的access
和refresh
可以通过报头中给定的或由饼干。
我可以实现后端,以返回JSON响应中的所有令牌,或设置cookie,或同时使用两者。
问题是,在客户端,我看不到存储这些令牌的真正方法,即:
这是我看到的选项
这就是jwt-sessions
宝石的建议。将CSRF保留在localStorage中,但将其他令牌保留在服务器设置的httpOnly cookie中。
这似乎是最安全的方法,但是SSR via getInitialProps
根本无法使用,因为它无法通过发送Cookie fetch
。我什至无法手动发送它们,因为在JS中看不到它们。
这就是官方的下一个示例似乎所做的(尽管只有一个可能是无状态的令牌)
服务器或浏览器都可以设置没有 httpOnly 的cookie 。
我可以通过SSR访问它,但这不使我对XSS开放吗?
只需将所有令牌放入localStorage
和/或即可sessionStorage
。这似乎是最糟糕的选择,因为它在SSR中不起作用,据我所知并不安全。
我想念什么吗?是否非httpOnly,如官方示例所示,可以吗?有没有更好的方法?还是我必须忽略SSR(因此是Next.js的杀手级功能之一)?