java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Cookie、Session、Token和JWT的区别

Java开发日记:Cookie、Session、Token和JWT的工作原理和适用场景

作者:小假是真的

还搞不清认证和授权?本文用生活化例子讲清Cookie、Session、Token和JWT的区别,帮你轻松理解它们的工作原理和适用场景,还涵盖了哈希算法和分布式session共享方案,让你全面掌握用户身份验证的核心知识

什么是认证(Authentication)

什么是授权(Authorization)

什么是凭证(Credentials)

什么是 Cookie

cookie 重要的属性

属性

说明

name=value

键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型
- 如果值为 Unicode 字符,需要为字符编码。- 如果值为二进制数据,则需要使用 BASE64 编码。

domain

指定 cookie 所属域名,默认是当前域名

path

指定 cookie 在哪个路径(路由)下生效,默认是 ‘/‘。如果设置为/abc,则只有/abc下的路由可以访问到该 cookie,如:/abc/read。

maxAge

cookie 失效的时间,单位秒。如果为整数,则该 cookie 在 maxAge 秒后失效。如果为负数,该 cookie 为临时 cookie ,关闭浏览器即失效,浏览器也不会以任何形式保存该 cookie 。如果为 0,表示删除该 cookie 。默认为 -1。-比 expires 好用。

expires

过期时间,在设置的某个时间点后该 cookie 就会失效。一般浏览器的 cookie 都是默认储存的,当关闭浏览器结束这个会话的时候,这个 cookie 也就会被删除

secure

该 cookie 是否仅被使用安全协议传输。安全协议有 HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。

httpOnly

如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全

什么是 Session

根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

Cookie 和 Session 的区别

什么是 Token(令牌)

Acesss Token

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
  4. 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据

Refresh Token

Token 和 Session 的区别

什么是 JWT

生成 JWT

jwt.io/www.jsonwebtoken.io/

JWT 的原理

Authorization: Bearer <token>

JWT 的使用方式

方式一

GET /calendar/v1/events
Host: api.example.com
Authorization: Bearer <token>

方式二

方式三

http://www.example.com/user?token=xxx

Token 和 JWT 的区别

相同:

区别:

常见的前后端鉴权方式

  1. Session-Cookie
  2. Token 验证(包括 JWT,SSO)
  3. OAuth2.0(开放授权)

常见的加密算法

注意:

  1. 以上不能保证数据被恶意篡改,原始数据和哈希值都可能被恶意篡改,要保证不被篡改,可以使用RSA 公钥私钥方案,再配合哈希值。
  2. 哈希算法主要用来防止计算机传输过程中的错误,早期计算机通过前 7 位数据第 8 位奇偶校验码来保障(12.5% 的浪费效率低),对于一段数据或文件,通过哈希算法生成 128bit 或者 256bit 的哈希值,如果校验有问题就要求重传。

常见问题

使用 cookie 时需要考虑的问题

使用 session 时需要考虑的问题

使用 token 时需要考虑的问题

使用 JWT 时需要考虑的问题

使用加密算法时需要考虑的问题

分布式架构下 session 共享方案

1. session 复制

任何一个服务器上的 session 发生改变(增删改),该节点会把这个 session 的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要 session ,以此来保证 session 同步
优点:可容错,各个服务器间 session 能够实时响应。缺点:会对网络负荷造成一定压力,如果 session 量大的话可能会造成网络堵塞,拖慢服务器性能。

2. 粘性 session /IP 绑定策略

优点:简单,不需要对 session 做任何处理。缺点:缺乏容错性,如果当前访问的服务器发生故障,用户被转移到第二个服务器上时,他的 session 信息都将失效。适用场景:发生故障对客户产生的影响较小;服务器发生故障是低概率事件 。实现方式:以 Nginx 为例,在 upstream 模块配置 ip_hash 属性即可实现粘性 session。

3. session 共享(常用)

4. session 持久化

将 session 存储到数据库中,保证 session 的持久化
优点:服务器出现问题,session 不会丢失缺点:如果网站的访问量很大,把 session 存储到数据库中,会对数据库造成很大压力,还需要增加额外的开销维护数据库。

只要关闭浏览器 ,session 真的就消失了?

不对。对 session 来说,除非程序通知服务器删除一个 session,否则服务器会一直保留,程序一般都是在用户做 log off 的时候发个指令去删除 session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分 session 机制都使用会话 cookie 来保存 session id,而关闭浏览器后这个 session id 就消失了,再次连接服务器时也就无法找到原来的 session。如果服务器设置的 cookie 被保存在硬盘上,或者使用某种手段改写浏览器发出的 HTTP 请求头,把原来的 session id 发送给服务器,则再次打开浏览器仍然能够打开原来的 session。恰恰是由于关闭浏览器不会导致 session 被删除,迫使服务器为 session 设置了一个失效时间,当距离客户端上一次使用 session 的时间超过这个失效时间时,服务器就认为客户端已经停止了活动,才会把 session 删除以节省存储空间。

总结

本文用生活化例子讲清Cookie、Session、Token和JWT的区别,帮你轻松理解它们的工作原理和适用场景,还涵盖了哈希算法和分布式session共享方案,让你全面掌握用户身份验证的核心知识。

到此这篇关于【Java开发日记】Cookie、Session、Token和JWT的工作原理和适用场景的文章就介绍到这了,更多相关Cookie、Session、Token和JWT的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文