一、session
1、客户端发送请求,服务器将登录信息存储在 Session 中,Session 依赖于 Cookie(cookie
指的就是在浏览器里面存储的一种数据,仅仅是浏览器实现的一种数据存储功能。Cookie
实际上是一小段的文本信息。),即服务器创建 Session 时会分配一个 SESSIONID,并在响应时将这个 SESSIONID 存储到 Cookie 中。
2、客户端收到这个 Cookie 后自动保存,并在下次访问时带上这个 Cookie,届时服务器就能通过这个 Cookie 中的 SESSIONID 找到对应的 Session 从而识别用户。
3、问题:对于分布式系统而言,服务器之间是隔离的,Session 是不共享的,存在 Session 共享问题
cookie与session区别
1、cookie数据存放在客户的浏览器上,session数据放在服务器上;
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session;
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。考虑到减轻服务器性能方面,应当使用cookie;
二、token
1、客户端通过账号密码登录。
2、服务器通过查询数据库进行验证。
验证成功后 ,创建一个 Token 存储在 Redis 中,并将这个 Token 返回给客户端。
3、客户端收到这个 Token 后将其保存,并在下次访问时带上这个 Token。
4、客户端再次访问服务器时携带 Token。服务器 验证 Token:通过请求头中的 Token 查询 Redis 中存储的用户信息即可识别用户。
三、JWT
1、概念
JWT (Json Web Token),JWT 由三部分组成:Header(加密算法和 Token 类型)、Playload(数据)、Signature。
// Decoded
header = {
"alg": "HS256",
"typ": "JWT"
}
playload = {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
signature = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 签名Secret)
// Encoded
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.7hQ9doI17Q47YK31oBIf-etsfFTVhSK9wwqgoOOr_zs
Header 经过 BASE64 编码后生成字符串。
Playload 经过 BASE64 编码后生成字符串。
Signature 将前两部分内容 + 密钥,HS256 算法进行加密签名。
2、优点:不依赖Cookie,使得其可以防止CSRF(跨站请求伪造)攻击;
适合分布式系统。