虽然JWT本身是无状态的,但结合Redis或其他存储机制后,系统其实就不再是完全无状态的了,而是部分有状态的了。
什么是无状态?
首先,什么是无状态呢?
无状态指的是:每个请求都是独立的、互相无关联的,处理本次请求时,无需依赖过去请求的内容。每次请求都必须包含服务器所需的所有信息。
JWT为什么是无状态的?
JWT就是因为它本身就包含了服务器验证时,所需要的一切必要信息(用户身份、过期时间、签名等),而这些信息并不需要服务器去存储、管理,服务器只要解析验证JWT就行,不用再去数据库进行查询这个JWT的状态(即是否还有效),所以说JWT本身的机制就是无状态的。
对比有状态机制
而对比Web中的Session,它就是有状态的。为什么呢?因为用户登录时,服务器会保存会话状态,而客户端只需在请求中携带会话ID即可。此时服务器就是在记录用户会话的“状态”,所以说是有状态的。
结合Redis后,还是无状态吗?
在结合Redis使用时,服务器就会把token存储在Redis中,此时就可以自由灵活地控制token是否有效。比如触发用户注销、管理员拉黑名单等操作时,服务器可以直接设置Redis中的token的“状态”,宣布为无效。又或是客户端去定时刷新token来保证会话的持久有效。这些行为都是将Token从“无状态”变为了“有状态”。
所以在这种情况下,Token本身仍然是无状态的,只是在服务器中增加了一个“状态管理层”(即使用Redis管理token),所以此时系统的验证机制就可以说是“有状态”的了。而不是“无状态”。严格来说,是“部分有状态”的。
总结
给JWT增加了有状态的部分机制后,给系统带来的好处是很多的。能够让整个验证机制更加灵活、大大地提升用户的体验,并且便于更加多样性地扩展、改造验证功能。