Cookie/JWT的区别和联系
1、cookie
1.1、什么是cookie
cookie是保存在用户浏览器端,用户名和密码等明文信息
1.2、cookie特点
- HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。
- HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
- cookie 存储在客户端: cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
- cookie 是不可跨域的: 每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。
- Cookie 曾一度用于客户端数据的存储,因当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。由于服务器指定 Cookie 后,浏览器的每次请求都会携带 Cookie 数据,会带来额外的性能开销(尤其是在移动环境下)。新的浏览器API已经允许开发者直接将数据存储到本地,如使用 Web storage API (本地存储和会话存储)或 IndexedDB 。
1.3、cookie举例
- 李四总是使用同台PC访问Internet
- 他首次访问1个电子商务网站
- 当他最初发出HTTP请求访问该站点时,该站点创 建一个唯一的 ID,并在后端数据库创建一个响应于 该ID表项
可以看到流程:
- 第一次请求,服务端生成cookie,在响应报文中返回。浏览器保存
- 下一次请求,用户请求报文中带着cookie信息,服务端就能识别用户。
2、JWT
2.1、什么是JWT
-
JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
-
是一种认证授权机制。
-
它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。
可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
2.2、JWT数据结构
- 第一部分:JWT头,是一个描述JWT元数据的JSON对象
-
base64UrlEncode(header) —>字符串
JWT头部分是一个描述JWT元数据的JSON对象,通常如下所示。
{ "alg": "HS256", "typ": "JWT" }
(1)、alg属性表示签名使用的算法,默认为HMAC SHA256(写为HS256)。
(2)、typ属性表示令牌的类型,JWT令牌统一写为JWT。
(3)、最后,使用Base64 URL算法将上述JSON对象转换为字符串保存。
- 第二部分: 有效载荷(七个默认字段+自定义私有字段)
-
base64UrlEncode(payload) —>字符串
(1)、有效载荷部分,是JWT的主体内容部分,也是一个JSON对象,包含需要传递的数据,JWT指定七个默认字段供选择。
iss: 发行人
exp: 到期时间
sub: 主题
aud:用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID 用于标识JWT
(2)、除以上默认字段外,我们还可以自定义私有字段,如下例:
{ "sub": "123456", "name": "chongc", "admin": true }
注意:默认情况下JWT是未加密的,任何人都可解读其内容,因此不要构建隐私字段,存放保密信息,以防信息泄露。JSON对象也是用Base64 URL算法转换为字符串保存。
- 第三部分:签名哈希
-
签名=HMACSHA256( base64UrlEncode(header) + “.” + base64UrlEncode(payload) ,secret)
(1)、签名哈希部分是对上面两部分数据签名,通过指定的算法生成哈希,以确保数据不会被篡改。
(2)、首先,需要指定一个密码(secret),该密码仅仅为保存在服务器中,并且不能向用户公开。
(3)、然后,使用标头中指定的签名算法,(默认情况下HMAC SHA256),根据以下公式生成签名。
(4)、HMACSHA256(base64UrlEncode(hesder) + “.” + base64UrlEncode(payload), secret)
(5)、在计算出签名哈希后,JWT头,有效载荷和签名哈希的三个部分组合成一个字符串,每个部分用"."分隔,就构成了JWT对象。
2.3、JWT 鉴权原理
2.4、JWT 核心
- 1)给用户颁发的token值相当于一把锁,服务器端的秘钥相当于一把钥匙
- 2)每次客户端请求都会携带这把锁,服务器端用秘钥去开这把锁,若果无法打开就证明是伪造的
2.5、JWT特点
- 1、JWT的最大缺点是服务器不保存会话状态,所以在使用期间不可能取消令牌或更改令牌的权 限,一旦JWT签发,在有效期内将会一直有效。
- 2、JWT本身包含认证信息,因此一旦信息泄露,任何人都可以获得令牌的所有权限。
- 3、为了减少盗用和窃取,JWT不建议使用HTTP协议来传输代码,而是使用加密的HTTPS协议进行 传输。
- 4、JWT不仅可用于认证,还可用于信息交换,善用JWT有助于减少服务器请求数据库的次数。