Cookie,Session,Token和Jwt详解

博客2:cookie,session和jwt

cookie

1.定义:是在用户浏览网站时有网络服务器创建并由用户的网络浏览器放置在用户计算机或其他设备上的小数据块。

根据定义,可以得出cookie的几个特性:由服务器创建,放置在客户端上,是一种小文本文件。

2.作用:由于http是一种无状态协议,每一次请求是独立的,服务器无法确认请求者的身份。一些站点为了实现服务器和浏览器的会话跟踪,让服务器能够为用户定制内容,需要用到一种状态维持机制,cookie就诞生了。

3.cookie的属性:

 

根据属性,这里可以注意到一些cookie的性质:

1)cookie name=value 的键值对, 要设置其他类型的数据,需要将其转换成字符串。

2)cookie是不可跨域的:每个cookie都会绑定单一的域名(domain)也只能用在单一的域名下。同级域名一下的多级域名可以共用。

3)由于cookie是保存在客户端的,用户可见,所以cookie容易被用户篡改(禁用、删除等),同时也容易被窃取和盗用,因此安全性不高。可以通过加密来提高安全性。

4)cookie的生命周期是由服务器设置的:有效期由maxAge设置。这里的有效期就是Cookie的生命周期。Cookie默认的maxAge值为–1, 默认本浏览器窗口以及本窗口打开的子窗口中会话期间有效。一般来说,Cookie有效期较长,有一周或两周左右。

5)大小有限,最大为4kb,保存的数据量有限。

session

1.定义:是一种基于服务器的记录客户状态的机制,保存在服务端,为了满足cookie的安全性缺陷,服务器生成一份session保存在服务端,将数据的id以cookie的形式传递给客户端,防止cooike存在用户端被篡改。

2.运行机制:在第一次请求的时候,服务器创建session并给客户端返回sessionID,客户端收到sessionID,将此信息存到cookie中,同时cookie记录此sessionID属于哪个域名。在第二次请求时,客户端携带cookie中的sessionID请求,服务器判断sessionID属于对应的哪个用户并执行之后的操作。

 

3.缺点:

1)服务器的开销会随着用户记录的增大而增大,通常是在内存中。

2)CORS,不同的域名下,Session无法共享。跨资源共享问题,多移动设备不支持。

3)CSRF用户容易受到CSRF攻击(跨站请求伪造,当用户保持在其他网站的登陆状态或者用户有cookie在某些正规网站时,而且诱导用户点击某些不正规链接,这些链接会利用这些登录状态或者cookie,来假装是用户本人向这些网站发送请求。)

4.cookie和session都是用来跟踪浏览器用户身份,两者的区别如下如所示:

 

token

1.定义:同cookie也是一种身份验证手段,但是本质上是服务端生成的一串字符串。当做客户端进行请求的一个令牌(访问资源接口API)。从安全性上来讲,token产生避免了使用cookie容易被恶意攻击入侵的问题,因为客户端发送过来的session id没办法进行验证是不是客户端的。用来验证这个id是否由我自己的服务器之前生成的而非恶意攻击者篡改的。

2.用法:当第一次登录后,服务器生成一个token,存到数据库中,key是uuid,value是用户信息。并将此token返回给客户端,以后客户端请求API时只需把令牌放到请求头里,无需再次带上用户名和密码。最后验证令牌是否过期,没有过期则获取value内容。

3.优点:

1)基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据,隐藏真实数据安全系数高。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库.

2)作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击(replay attack,攻击者发送一个目标主机已经接收的数据包,特别是在认证过程中,用于认证用户身份时,从而冒用用户身份),而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。

3)支持手动控制,过期、吊销等。

4)适用于分布式/微服务

4.缺点:

1)存放在数据库,依赖服务器资源。

2)效率相对jwt比较低

jwt(JSON Web Tokens)

1.适用于分布式站点的单点登录(SSO)场景、信息交换(安全性更高)

2.用法:

3.组成:jwt的三个部分:Header头部,Playload负载和Signature签名。之间用”.”分割。

 

1)Header:包括两部分alg表示使用的算法,typ表示token的类型。

2)Playload:包含一些声明Claim(实体的描述,通常是一个User信息,还包括一些其他的元数据)

3)Signature:签证信息,由三部分组成header (base64后的)、payload (base64后的)、secret(secret 是保存在服务器端的, jwt 的签发生成也是在服务器端的,secret 就是用来进行 jwt 的签发和 jwt 的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个 secret , 那就意味着客户端是可以自我签发 jwt 了。)

4.和token的区别:

和token一样,服务器同样不保存任何用户信息。但是不同的是jwt不需要查库或者很少查库验证token是否有效,直接在服务端验证。用户的信息及加密信息在第二部分payload和第三部分签证中已经生成,只要在服务端使用密钥解密进行校验就行,并且校验也是JWT自己实现的。

5.jwt的特点:

1)服务端无状态的认证方式,服务器不在需要存储session,使得服务器认证鉴权业务可以方便扩展。但这也是 JWT 最大的缺点:由于服务器不需要存储 Session 状态,因此使用过程中无法废弃某个 Token 或者更改 Token 的权限。也就是说一旦 JWT 签发了,到期之前就会始终有效,除非服务器部署额外的逻辑。

2)不依赖cookie,可以跨域,也就是说,可以使用任何域名提供API 服务而不需要担心跨域资源共享问题(CORS)

3)可以降低服务器查询数据库的次数,因此也被用为信息交换。

4)防止CSRF跨网站伪造

5)支持移动设备(cookie不支持)

6)尺寸小,传输速度快

7)为了减少盗用,JWT 不应该使用 HTTP 协议明码传输,要使用 HTTPS 协议传输。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值