目录
- Session和Cookie的关系
- Cookie与Session的区别
- 如何实现Session共享
- [JWT 由哪些部分组成?](#JWT 由哪些部分组成?)
- [如何防止 JWT 被篡改?](#如何防止 JWT 被篡改?)
- [JWT 的特点](#JWT 的特点)
Session和Cookie的关系
Session和Cookie都可以用来实现跟踪用户状态 ,而二者是关系的:Session的实现依赖于Cookie。
- Session的底层原理:
- 当client(浏览器)第1次发起请求并获取session后,服务端在服务器内部创建一个Session对象,并将该session的id以(
JSESSIONID=id
值)的cookie写回浏览器 - 当client(浏览器)二次请求时,会自动携带Cookie(也就是
JSESSIONID
),服务端根据cookie记录的id值获取相应的Session
- 当client(浏览器)第1次发起请求并获取session后,服务端在服务器内部创建一个Session对象,并将该session的id以(
Cookie与Session的区别
- 存储位置不同
cookie:是针对每个网站的信息,保存在客户端 .
session:是针对每个用户的,Session中主要保存用户的登录信息,保存在服务器端. - 存储数据大小不同
cookie:一个 cookie存储的数据不超过4K 。
session:session存储在服务器上可以任意存储数据, 无大小限制. - 生命周期不同
cookie:cookie可以主动设置生命周期。还可以通过浏览器工具清除.
session:session的生命周期是间隔的,从创建时开始计时如在30min内没有访问session,那么session生命周期就被销毁。 - 数据类型不同
cookie:value只能是字符串类型 。
session:value是object类型。 - 安全性不同
cookie不是很安全 ,别人可以分析存放在本地的cookie并进行cookie欺骗.
考虑到安全应当使用session。
如何实现Session共享
session共享的原因:维护用户状态、提升用户体验、负载均衡、资源共享。
-
一种解决方案是 session 数据持久化.,写入数据库或别的持久层。各种服务收到请求后,都向持久层请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层万一挂了,就会单点失败, 同时它增加了数据库的压力.
-
另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。
JWT 由哪些部分组成?
WT (JSON Web Token) 是目前最流行的跨域认证解决方案,是一种基于 Token 的认证授权机制。 是一种规范化之后的 JSON 结构的 Token。
实际的 JWT 大概就像下面这样。
它是一个很长的字符串,中间用点(.)分隔成三个部分。
JWT 的三个部分依次如下。
- Header(头部) 明文
- Payload(负载) 明文
- Signature(签名)
如何防止 JWT 被篡改?
有了签名之后,即使 JWT 被泄露或者截获,黑客也没办法同时篡改 Signature、Header、Payload。
这是为什么呢?因为服务端拿到 JWT 之后,会解析出其中包含的 Header、Payload 以及 Signature 。服务端会根据 Header、Payload、密钥再次生成一个 Signature 。拿新生成的 Signature 和 JWT 中的 Signature 作对比,如果一样就说明 Header 和 Payload 没有被修改。
不过,如果服务端的秘钥也被泄露的话,黑客就可以同时篡改 Signature、Header、Payload 了。黑客直接修改了 Header 和 Payload 之后,再重新生成一个 Signature 就可以了。
密钥一定保管好,一定不要泄露出去。JWT 安全的核心在于签名,签名安全的核心在密钥。
JWT 的特点
- JWT 默认是不加密,但也是可以加密的。生成原始 Token 以后,可以用密钥再加密一次。
- JWT 不加密的情况下,不能将重要数据写入 JWT。
- JWT 不仅可以用于认证,也可以用于交换信息。有效使用 JWT,可以降低服务器查询数据库的次数。
- JWT 的最大缺点是,由于服务器不保存 session 状态,因此无法在使用过程中废止某个 token,或者更改 token 的权限。也就是说,一旦 JWT 签发了,在到期之前就会始终有效,除非服务器部署额外的逻辑。
- JWT 本身包含了认证信息,一旦泄露,任何人都可以获得该令牌的所有权限。为了减少盗用,JWT 的有效期应该设置得比较短。对于一些比较重要的权限,使用时应该再次对用户进行认证.
- 为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。