为什么要用 Token?
可以解决哪些问题呢?
1.Token 完全由应用管理,所以它可以避开同源策略
2.Token 可以避免CSRF 攻击
3.Token 可以是无状态的,可以在多个服务间共享
需要设置有效期吗?
对于这个问题,我们不妨先看两个例子。一个例子是登录密码,一般要求定期改变密码,以防止泄漏,所以密码是有有效期的;另一个例子是安全证书。SSL 安全证书都有有效期,目的是为了解决吊销的问题。所以无论是从安全的角度考虑,还是从吊销的角度考虑,Token 都需要设有效期。
那么有效期多长合适呢?
只能说,根据系统的安全需要,尽可能的短,但也不能短得离谱——想像一下手机的自动熄屏时间,如果设置为 10 秒钟无操作自动熄屏,再次点亮需要输入密码,会不会疯?如果你觉得不会,那就亲自试一试,设置成可以设置的最短时间,坚持一周就好(不排除有人适应这个时间,毕竟手机厂商也是有用户体验研究的)。mis系统不也是根据用户的使用来调整的锁屏时间吗
时序图表示:
Token类型
两种最常见的token
类型:access token
和refresh token
。
- Access Token携带了直接访问资源的必要信息。换句话说,当客户端将
access token
传给管理资源的服务器时,该服务器可以使用token
中包含的信息来决定是否授权给客户端。access token
通常有一个过期时间,而且通常时间非常短暂。
- Refresh Token携带了用来获取新的access token的必要信息。换句话说,当客户端需要使用access token来访问特定资源的时候,客户端可以使用refresh token来向认证服务器请求下发新的access token。通常情况下,当旧的access token失效之后,才需要获得新的access token,或者是在第一次访问资源的时候。refresh token也有过期时间但是时间相对较长。refresh token对存储的要求通常会非常严格,以确保它不会被泄漏。它们也可以被授权服务器列入黑名单。
通常由具体的实现来定义token是透明的还是不透明的。通用实现允许对access token进行直接授权检查。也就是说,当access token传递给管理资源的服务器时,服务器可以读取token中包含的信息,并决定用户是否被授权(不需要对授权服务器进行检查)。这就是token必须签名的原因之一(例如使用JWS)。另一方面,refresh token通常需要对授权服务器进行检查。处理授权检查的这种分离方式有以下3个优点:
- 改进了对授权服务器的访问模式(更低的负载,更快的检查)
- 泄露access token的访问窗口更短(这些access token会很快过期,从而减少泄露的token访问受保护资源的机会)
- 滑动session(见下文)
滑动session
滑动session是只一段时间不活动后过期的session。正如你想到的,使用access token和refresh token可以很容易实现这个功能。当用户执行操作时,会发出一个新的access token。如果用户使用过期的access token,则session被认为是不活动的,并且需要新的access token。这个token是否可以通过access token获得,或者是否需要新的认证轮回,由开发团队的要求来定义。
安全考虑
refresh token的存活时间较长。这意味着当客户端获取refresh token时,必须安全的存储此token以防止潜在攻击者使用此token。如果refresh token泄露,它可能会被用来获取新的access token(并访问受保护的资源),直到它被列入黑名单或到期(可能需要很长时间)。refrsh token必须发给单个经过身份验证的客户端,以防止其他方使用泄漏的token。访问令牌必须保密,但是正如你所想象的那样,安全考虑因其寿命较短而不那么严格。