提到用户登陆态这个问题,不免就会说起 Cookie
、Session
、Token
等三个知识点。因此,今天就略微总结一下这三者在这个场景下的应用。javascript
我想做为一个前端,对上述的三者中,最熟悉的就是 Cookie
了。由于前端能够本身操做 Cookie
,而后实现本身想要的需求。不过,在不少时候,千万注意不要用 Cookie
存储一些隐私信息,由于一旦被 XSS
(脚本注入)就 GG。前端
回到正题,Cookie
在须要记录用户登陆态的场景下,并非前端直接存储用户信息,而是在第一次请求登陆时,后端将这个用户的信息存储在 Cookie
中(能够设置有效时间、域名等等),而且在响应头中一块儿发送给前端,而后前端在以后的请求中,都会在请求报文中携带这个 Cookie
(携带的过程,是浏览器自动判断后端是否在响应报文中存在 Set-Cookie
,存在则一样会在以后的请求报文中携带 Set-Cookie
),因此以后,服务端判断是否存在这个 Cookie
,存在则直接读取响应的用户信息,不存在则进行登陆操做。从而,完成整个的登陆状态的记录。java
须要注意的是,后端在
Set-Cookie
的时候,必定要设置这个Cookie
为http-only
,即这个Cookie
只能被HTTP
协议读取,禁止前端以任何方式读取。算法
对于 Session
这个名称,若是没有了解过的同窗可能会一脸懵。相比较 Cookie
是存储在客户端不一样的是,Session
是存储在后端的,具体的存储方式,Session
通常是在 Tomcat
、Jetty
等容器中进行管理。后端
一样是记录用户登陆态,Session
也会用到 Cookie
。不过不一样于 Cookie
的是,以 Session 的方式记录用户登陆态,会将 用户的信息存储在 Session 中,而且会将 SessionId
塞到 Cookie
中,这个 Cookie
一样会出如今响应报文中(一样须要设置 http-only
),以后发生的就和 Cookie
记录登陆态的过程相似,只不过读取用户信息是根据 SessionId
来读取对应的 Session
中的用户信息。浏览器
以 Token
形式记录登陆态和 Cookie
记录登陆态有点相似,可是不一样的是,Token
并非直接存储用户信息,而是将用户信息编码后,经过响应报文传给前端,以后每一次请求,请求报文中都会带有这段编码信息,后端经过解码得到用户信息,这个方法也被称做 JWT
(Json Web Token
)。(因此 Token
适合分布式微服务,即服务端不须要保存特定的用户信息)分布式
值得一提的是 JWT
是由三个部分组成: 1.Header
,一般是一个 JSON
对象,用于描述 JWT
,例如微服务
{
"alg": "HS256",
"typ": "JWT"
}
复制代码
alg
属性表明进行加密的签名的算法,默认是 HS256;type
表明这个令牌的类别。编码
2.Payload
,是用于存放实际须要传输的数据,JWT
官方规定的字段以下:加密
iss: 签发人
exp:过时时间
sub:主题
aud:受众
nbf:生效时间
iat:签发时间
jti:编号
复制代码
你们可能会发现,没有咱们实际须要的特定字段,JWT
也容许咱们自定一些字段(例如用户名之类的)。
3.Signature
,是用于对前面的两部分的数据进行签名,防止数据篡改。由服务端定义生成一个秘钥,而后将这三个部分进行签名算法加密,每一个部分经过 . 链接成一个字符串,经过响应报文发送给客户端。