我读到过,存储令牌最安全的方法实际上是使用cookie作为刷新令牌,使用内存(如变量)作为访问令牌。虽然我知道这是安全的,但我不太明白它在实践中是如何工作的。这是否意味着我们必须在每次请求时用我们的刷新令牌创建一个新的访问令牌?或者有没有一种方法可以使它有效并复制到新的变量中,直到它过期?在内存中存储访问令牌,这不是一个问题吗?访问令牌将在每次刷新页面时被清除,因此每次登录时,我都需要再次调用登录端点我尝试过一些方法,比如在localStorage中存储访问令牌,但这似乎是一个很大的禁忌
6rvt4ljy1#
虽然我知道这是安全的,但我并不真正理解它在实践中是如何工作的。这是否意味着我们必须在每次请求时使用刷新令牌创建一个新的访问令牌?不是在每次请求时,而是在每次整页重载时,你可以把它存储在react context这样的东西里,它位于内存中,可以让你的整个应用程序都可以使用它,然后你可以有一个核心的fetch实现从context中读取它,并把它放在header或其他地方。此外,在核心获取实现中,您将检查是否有由于访问令牌过期而出错的请求,如果发生这种情况,则获取另一个访问令牌,将其设置回上下文,然后重新执行请求。在内存中存储访问令牌,这不是一个问题吗?访问令牌将在每次刷新页面时被清除,因此每次登录时,我都需要再次调用登录端点这是正确的,但这是设计的。这里有关于影响首次加载时间的权衡(但我不希望它是可怕的)。你会在你的组件树中的某个较高的地方调用它,所以它发生在早期。这是很正常的,我已经看到了很多。如果你真的在乎这个,我见过一些解决方案,其中您将访问令牌放在另一个仅HTTP的cookie中(在服务器端创建),用于整个页面加载,这意味着它是为将来的请求发送的。从那里开始,如果它需要一个新的,它会进行API调用,该调用也使用set-cookie将一个新的写入客户端。如果在实际响应中获取页面本身,就可以避免任何客户端请求的瀑布。有些人只是将其存储在本地存储中,但正如您所暗示的,那里也有安全性权衡,因此最好避免。
fetch
set-cookie
1条答案
按热度按时间6rvt4ljy1#
虽然我知道这是安全的,但我并不真正理解它在实践中是如何工作的。这是否意味着我们必须在每次请求时使用刷新令牌创建一个新的访问令牌?
不是在每次请求时,而是在每次整页重载时,你可以把它存储在react context这样的东西里,它位于内存中,可以让你的整个应用程序都可以使用它,然后你可以有一个核心的
fetch
实现从context中读取它,并把它放在header或其他地方。此外,在核心获取实现中,您将检查是否有由于访问令牌过期而出错的请求,如果发生这种情况,则获取另一个访问令牌,将其设置回上下文,然后重新执行请求。
在内存中存储访问令牌,这不是一个问题吗?访问令牌将在每次刷新页面时被清除,因此每次登录时,我都需要再次调用登录端点
这是正确的,但这是设计的。这里有关于影响首次加载时间的权衡(但我不希望它是可怕的)。你会在你的组件树中的某个较高的地方调用它,所以它发生在早期。这是很正常的,我已经看到了很多。
如果你真的在乎这个,我见过一些解决方案,其中您将访问令牌放在另一个仅HTTP的cookie中(在服务器端创建),用于整个页面加载,这意味着它是为将来的请求发送的。从那里开始,如果它需要一个新的,它会进行API调用,该调用也使用
set-cookie
将一个新的写入客户端。如果在实际响应中获取页面本身,就可以避免任何客户端请求的瀑布。有些人只是将其存储在本地存储中,但正如您所暗示的,那里也有安全性权衡,因此最好避免。