我正在开发一个Next.js应用程序,并使用令牌实现身份验证。我有三个代币:accessToken、refreshToken(两者都是jwt,包含userId、email和role)和csrfToken(加密随机32位字符串)。我想知道在我的Next.js应用程序中安全存储这些令牌的最佳实践。这是我目前的方法,我希望得到反馈和建议,说明这是否是推荐的方法,或者是否有更好的替代方法。
我的建议是将refreshToken存储在一个安全的、仅支持HTTP的cookie中。这种方法可以确保令牌受到保护,免受跨站点脚本(XSS)攻击,并且无法被JavaScript访问。
至于accessToken和csrfToken,我计划将它们作为登录POST请求的响应接收,然后使用上下文提供程序将它们存储在Next.js中。通过这样做,我可以轻松地跨应用程序中的不同组件和页面访问这些令牌。
是否建议采用这种方法?是否有任何我应该注意的潜在安全风险或缺点?在Next.js应用程序中存储令牌是否有任何被认为是最佳实践的替代方法?任何见解或例子将不胜感激。
1条答案
按热度按时间6mw9ycah1#
OAuth for Browser Based Apps文章提供了一些最新的最佳实践。安全值不能完全安全地存储在浏览器中。第6.2节描述了目前常用的前端后端方法。
围绕XSS关注点和令牌拦截的额外攻击向量意味着,在发送数据请求时,仅基于HTTP cookie的安全性被认为更安全,并且威胁被更好地理解。
一个可靠的方法是将所有OAuth令牌存储在最新的
HTTP-only SameSite=strict
cookie中。CSRF令牌是可以存储在存储器或甚至本地存储装置中的辅助值。如果从浏览器中泄漏,则无法访问安全数据。使用Cookie时,XSS仍然是一个问题。对于任何带有XSS漏洞的基于浏览器的应用程序,恶意代码可以做任何应用程序可以做的事情,例如将cookie发送到后端。因此,还要遵循OWASP XSS最佳实践,包括Content Security Policy,这有助于降低数据泄露风险。