小Hub领读:
2018年写的一篇文章,哈哈哈,体验一下我当时的写作风格咧~
一般情况下,web项目都是通过session进行认证,每次请求数据时,都会把jsessionid放在cookie中,以便与服务端保持会话。
前后端分离项目中,通过token进行认证(登录时,生成唯一的token凭证),每次请求数据时,都会把token放在header中,服务端解析token,并确定用户身份及用户权限,数据通过json交互。
但是token一般都是UUID生成的一个随机码,作为一个key使用,从缓存中获取具体的用户信息。所以一般需要一个存储介质来保存token和用户信息。在一些场景中,如单点登录时候有点麻烦。
有没一种更方便的方式呢?答案是有的,就是我们今天要讲的jwt。jwt也算是一个特殊的token,不过jwt中自带了用户的相关信息,所以不需要存储介质,只需要验证签名保证安全的前提下就可以直接获取到用户的相关信息。
在讲jwt之前,我们先回顾一下session、token的相关内容。
session与cookie
我们都知道http是无状态的,所以需要某种机制来识别用户和保存用户的状态。而这个机制就是session。session是保存在服务端的,服务器通过session辨别用户,然后做权限认证等。
那如何才知道用户的session是哪个?这时候cookie就出场了,浏览器第一次与服务器建立连接的时候,服务器会生成一个sessionid返回浏览器,浏览器把这个sessionid存储到cookie当中,以后每次发起请求都会在请求头cookie中带上这个sessionid信息,所以服务器就是根据这个sessionid所以key获取到具体session。
google浏览器中查看cookie内容的方法有两个:
(一)F12,查看具体请求链接的请求头信息
(二)点击浏览器输入框的认证小锁,可以查看这个域名的相关cookie信息。
涉及到集群环境得话,session需要弄成分布式session,从而保证多个应用的会话状态一致性。spring项目可以使用spring session+redis来解决session共享问题。shiro项目可以重写redis版SessionDAO,把会话信息存到redis中实现共享。
(所以,明白没?)
接下来我们再来聊聊token。
Token
token,就是我们常说的用户身份令牌。只有涉及到受限资源的访问时候才需要身份令牌,所以,在访问开放资源时候http中是没有token的信息的,也即是说这时候会话是完全无状态的。token的是在用户登录以后生成的。用户登录之后我们会生成一个token作为key保存用户的信息并返回给客户端。保存方式set(token,用户信息)存储到redis等介质。之后客户端发起的请求只要在请求头中附带token的信息就可以完成身份认证。
开源项目renren-fast采用了前后分离的机制,使用token来完成身份认证,并且集成了shiro框架,所以想实战的可以去clone下来玩玩~
https://gitee.com/renrenio/renren-fast
(只能帮你到这了~)
好了