本系列主要整理前端项目中需要掌握的知识点。本节介绍登录状态存储。
HTTP是一种无状态的协议,这会导致每次请求都是独立的,服务器没办法判断两次请求是否来自同一个用户,进而也没办法判断本次用户是否需要重新出入用户名和密码,此时就需要存储登录状态,来方便同一个用户登录时不需要重新输入账号密码。

Cookie是服务器端发送给客户端的一段特殊信息,这些信息以文本的方式存储在客户端,客户端每次向服务器发起请求时都会携带上Cookie,服务端通过Cookie获取客户端传递过来的信息。但是如果把用户信息都存储在Cookie中,一旦Cookie被获取到,那么用户的信息就会暴露,因此这这是非常不安全的,又引入了SessionID。

首先使用用户名和密码发送给服务器,服务器核对后发现密码是对的,身份认证成功,于是在服务器这边创建一个SessionID和会话结束时间,SessionID通常是一串没有规律的字符串。创建完成后,服务器要把SessionID和会话结束时间发送给浏览器,这里就用到了Cookie,并且把SessionID加入到Cookie里,再把会话结束时间对应设置为这个Cookie的有效期,浏览器拿到Cookie后进行保存,这时,浏览器保存的并不是用户名和密码,而是SessionID。后续发请求时,都会自动发送Cookie到相应服务器那里,也就是说,浏览器的下次访问、下下次访问都会自动发送这个SessionID给服务器,直到Cookie的有效期失效之后,浏览器一般就会自行删除这个Cookie,这时就是会话结束了。在Cookie失效之后,用户就得重新输入用户名密码了。
用户首次登录时:

后续的登录就可以直接使用Cookie进行身份验证了:

Token是服务端生成的一串字符串,作为客户端请求的一个令牌。当第一次登录后,服务器会生成一个Token并返回给客户端,客户端后续访问时,只需要带上这个Token就可以完成身份认证。

用户首次登录时:

后续页面访问时:

最常用的Token生成方式是使用JWT(Json Web Token),JWT的本质就是一个字符串,它将用户的信息保存到一个JSON字符串中,然后编码得到一个Token,并且这个Token带有签名信息,在接受后可以校验是否篡改。
JWT结构: JWT由Header(头部)、PayLoad(有效载荷)、Signature(签名)组成。
JWT的认证流程如下:
POST请求,建议使用HTTPS进行传输,防止敏感信息被篡改。JWT的Payload,将其与JWT Header分别进行Base64编码拼接后签名,形成一个JWT Token,形成的JWT Token就是一个如同aaa.bbb.ccc的字符串JWT Token字符串作为登录成功的结果返回给前端。前端可以将返回的结果保存在浏览器中,退出登录时删除保存的JWT Token即可JWT Token放入HTTP请求头中的Authorization属性中(解决XSS和CSRF问题)JWT Token,验证其有效性。将header做base64解码,得到JWT使用什么算法进行签名的,然后在用这个算法,对header和payload进行一次签名,与token本身的签名进行对比,判断第三个部分的字符串是否一致,如果不同,则认为这个token是被篡改过的。JWT Token中包含的用户信息,进行其他逻辑操作(一般是根据用户信息得到权限等),返回结果。为什么使用Token不会导致服务端压力过大?
原因就是Token的验证方式,服务端检查token的方式是将header用base64解码,得到JWT使用什么算法进行签名,然后再用这个算法对header和payload进行一次签名,与token本身的签名进行对比,判断三个部分的字符串是否一致,如果不同,就是验证失败。所以服务端存储的Token信息只是一个验证方法,且无论有多少个客户端,都是用同一种方式进行验证的。
优点:
缺点:
