当前位置: 首页 > 科技观察

如何用30s向面试官解释清楚Token

时间:2023-03-15 15:44:30 科技观察

是什么。前言上一篇介绍了Session-Cookie的认证过程,简单回顾了基本步??骤:客户端(浏览器)向服务器端发送用户名和密码,服务器端通过认证后创建一个Session。对象,在Session中保存与用户相关的数据,如用户角色、登录时间等。服务端将Session对象的唯一标识SessionId返回给用户,并写入客户端的Cookie中。客户端后续的每次请求都会传递Cookie,将SessionId传回给服务端。服务端收到SessionId,并根据它找到Session对象,从而获取到用户信息。这种方式的缺点是在分布式集群的情况下无法保证每台服务器的Session相同。上一篇文章也很简单。介绍了多个Session是如何在多个服务器之间共享的。显然,Session的维护给服务器带来了很大的麻烦。有没有更好的解决办法,不直接用Session可以吗?为此,Token应运而生。30s图TokenAuthentication首先,什么是Token?简单来说,Token其实就是一串字符串,一个token。当客户端访问服务器时,服务器会在验证通过后为其颁发一个token。之后客户端就可以携带这个token来访问服务器了。客户端只需要验证令牌的有效性。一般来说,Token的组成是这样的:uid(用户的唯一标识)+time(当前时间的时间戳)+sign(签名,Token的前几位通过hash压缩成一定的长度algorithmHexadecimalstring)基于token的认证步骤如下图,带文字:1)客户端(浏览器):用户向服务器发送登录信息(用户名和密码),请求登录验证;2)server:验证用户名密码等,验证成功后生成token返回给前端。此令牌是后续身份验证的唯一凭据。服务端需要将token及其对应的用户信息存储在数据库或缓存中;3)客户端:将服务器返回的token存放在cookie或localStorge中,在后续每次请求前,从cookie或localStorge中取出token,设置到HTTPHeader中(可通过HTTP请求拦截器实现);4)服务器:服务器收到客户端的请求,从HTTPHeader中取出token,在缓存或数据库中校验(token是否存在/根据token是否能找到对应的用户),如果验证通过,将进行进一步的业务操作,否则将拒绝执行。补充阅读Token认证服务器代码先来看登录,就是判断用户名和密码是否正确。如果正确,则生成一个字符串作为token返回(这里偷懒直接用UUID生成),并和用户信息(这里简单保存用户名)一起存储在数据库或缓存(这里使用redis,过期时间可自行配置)。注销的本质是删除Redis中保存的token。完整内容如下:又一个拦截器,前端拿到后端返回的token会在每次请求前的HTTP头中带上这个token,服务端会设置拦截器取出token在Header中,然后去Redis判断token是否存在,如果存在则允许下一步:RefreshToken一般来说,为了安全起见,为了防止token被攻击者窃取,不会设置token的有效期如果过长,用户会因为token过期需要重新登录生成新的token。如何做到用户不需要经常登录呢?RefreshToken机制出现了。我们称之前的Token为AccessToken。业务接口使用这个AccessToken进行身份验证和鉴权。RefreshToken是TokenRefreshToken的过期时间设置,专门用于AccessToken过期后获取新的AccessToken。较长的,比如一两个月,而AccessToken的过期时间设置得较短,比如一周,这样可以缩短AccessToken的过期时间,保证安全,同时,用户不会因为频繁过期而需要重新登录。food:1)客户端(浏览器):用户向服务器发送登录信息(用户名和密码),请求登录验证;2)服务器:验证用户名和密码等,验证成功后,生成AccessToken和RefreshToken并返回给前端,服务器需要将这两个token及其对应的用户信息存储在数据库或缓存中;3)客户端:将服务器返回的AccessToken和RefreshToken存放在cookies或localStorge中,后续每次请求前,从cookie或localStorge中取出AccessToken并设置到HTTPHeader中(可以通过HTTP请求拦截器);4)服务器:验证AccessToken有效:正常返回数据,验证AccessToken过期:拒绝请求Client:重启发起请求,在HTTPHeader中携带RefreshToken发送给服务器Server:Verify客户端发送的RefreshToken,验证成功后生成新的AccessToken,返回给客户端Client:获取服务端返回的新的AccessToken,如何重新发起请求并携带新的AccessToken了解RefreshToken的必要性,或者为什么使用RefreshToken更安全?每次访问都必须携带AccessToken,这样更容易被盗。RefreshToken客户端获取到后会保存。RefreshToken会在AccessToken过期后使用,所以粗略地说,RefreshToken只会在网络中。上传两次,拿到的时候上传一次,使用的时候上传一次时间(从上图可以看出),所以RefreshToken被盗的风险远小于AccessToken