目前,我的web应用程序上有登录功能,在我发出登录请求后,服务器会用一个包含2个令牌的JSON对象进行响应:
这是登录功能:
async function login() {
const data = {
"email": "user1@gmail.com",
"password": "testPassword123"
}
const response = await Backend.post('auth/login/', data)
console.log(response.data)
}
这就是回应:
{
"access": "access_token_here",
"refresh": "refresh_token_here"
}
据Postman称,该回复还包含3个cookie:
1) access_token=access_token_here; Path=/; Domain=localhost; HttpOnly; Expires=Thu, 29 Oct 2020 06:49:56 GMT;
2) csrftoken=csrf_token_here; Path=/; Domain=localhost; Expires=Thu, 28 Oct 2021 06:44:56 GMT;
3) sessionid=session_id_here; Path=/; Domain=localhost; HttpOnly; Expires=Thu, 12 Nov 2020 06:44:56 GMT;
要向服务器中受保护的端点发出请求,我可以将access_token作为cookie或Bearer令牌发送。我的理解是,将这些代币存储在本地存储中不是很安全。
那么我如何将它们存储在httpOnly cookie中呢?或者有更好的方法来处理这个问题吗?
我的后端服务器使用Django Rest Framework。
我想你想设置httpOnly cookie,因为它比在localStorage中设置令牌更安全?
最安全的方法是只将令牌存储在内存(状态(中,而不将其存储在cookie或localStorage中。每次刷新页面后,强制用户再次登录。这就是银行网站的运作方式。
如果您需要在客户端存储令牌(您不想在每次刷新后强制登录(,那么我建议您使用localStorage而不是cookie。React本身受到XSS的保护。但是,如果会有XSS,那么,当然,localStorage数据很容易读取,但cookie(甚至httpOnly(中的数据也可能被利用(通过使用可用cookie发送请求(。localStorage和cookie都容易受到XSS的攻击,但正如我所写的,React有针对XSS的保护。使用localStorage在实现中也更容易。
请参阅此讨论:链接到reacjs子版块reddit。
您可以使用set_cookie(key,value,https=True(进行设置,并在react请求中使用{withcredentials=True}你可以参考这篇文章https://www.procoding.org/jwt-token-as-httponly-cookie-in-django/