【用户登录状态保持】以token和session方式为例
一、前置知识
首先,http连接是无状态的,不会保持。也就是说,如果不采取某种措施,用户登录状态在刷新浏览器后就会消失。为了解决用户登录状态无法保持的问题,我们使用Token或者session方法来存储用户登录信息(注意不存用户名密码)。常见的存储方式是cookie和localstorage,区别在于localstorage容易遭受xss攻击,而cookie可以设置在http头中,设置一些属性能非常安全的保存cookie。存储的信息一般是Token或者sessionId,二者区别在于Token的验证在后端,而sessionId的验证在后端和数据库(数据库中搜索用户会话存活日期),在技术选型时要权衡性能和安全性,综合项目实际选择Token或者session。
二、Token
Token是采用算法加密用户登录信息的做法,流程如下:
1·用户首次登录,输入用户名密码。
2·后端收到用户的用户名密码,校验正确(登录成功、数据库中有用户信息)。
3·通过算法将用户登录状态加密生成Token,密钥存储在后端。
4·后端将Token发送给前端,前端将Token通过cookie或者localstorage存储。
5.用户下次登陆时,将Token发送给后端,后端通过解密得到用户登录信息。
可以看到,Token的验证不需要通过数据库,这减小了服务器压力。目前流行采用JWT(Json Web Token)加密,该方法将Token分为三部分,eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXNzd29yZCI6IjEyMyIsImV4cCI6MTU5NzM5Nzc0OCwidXNlcm5hbWUiOiJ6aGFuZ3NhbiJ9.LI5S_nX-YcqtExI9UtKiP8FPqpQW_ccaws2coLzyOS0
第一部分头部 (Header),存储加密算法等元数据,第二部分载荷 (Payload),存储用户名,ID等,第三部分签名 (Signature)是JWT核心,存储头部,载荷加密后的密文。算法原理如下:
1·头部和载荷是明文,用户在第一次登录时JWT就会生成头部和载荷。签名是密文,头部和载荷通过后端存储的密钥经过头部存储的加密算法计算后得到签名,JWT就生成好了。将JWT传回前端,前端通过cookie或者localstorage存储。
2·后续用户登录时,将JWT传给后端,后端通过JWT密钥,用头部存储的算法解密签名后得到明文,和JWT头部,载荷明文比对。相同登录成功,不同登录失败

三、session
session存储登录状态的方式简单粗暴,前端直接存储sessionID(一般用cookie)。用户第一次登录后,后端生成一个sessionID,保存用户登录信息。后续登录时,前端将sessionID发送给后端,后端验证(数据库查询)后返回用户登录结果。
可以看到,session方案需要经过数据库验证,所以有额外性能开销。
四、比较
| 特性 | Cookie |
LocalStorage (Token)
|
| 存储内容 | Session ID | JWT Token |
| 传输方式 | 自动携带(Set-Cookie) |
手动添加到请求头
|
| 安全性 | 相对安全(可设置 HttpOnly) | 存在 XSS 风险 |
| 应用场景 | 传统网站架构,服务端渲染 |
前后端分离架构(SPA),移动应用
|

浙公网安备 33010602011771号