Cookie、Session、Token、JWT区别

1. 什么是Cookie?

● HTTP 是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 去实现。
● cookie 存储在客户端:cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。
● cookie 是不可跨域的:每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(靠的是 domain)。

2. 什么是 Session?

● session 是另一种记录服务器和客户端会话状态的机制
● session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中
● session认证流程:
1)用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的session;
2)请求返回时将此session的唯一标识信息sessionId返回给浏览器;
3)浏览器接受到服务器返回的sessionId信息后,会将此信息存入到cookie中,同时cookie记录此sessionId属于哪个域名;
4)当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在cookie信息,如果存在自动将cookie信息也发送给服务器,服务器会从cookie中获取sessionId,再根据sessionId查找对应的session信息,如果没有找到说明用户没有登录或者登录失效,如果找到session证明用户登录可执行后面操作。
根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

3. 什么是 Token(令牌)?

● 访问资源接口(API)时所需要的资源凭证;
● 简单token的组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串)
● 特点:
  1)服务器无状态化、可扩展性好;
  2)支持移动端设备
  3)安全
  4)支持跨程序调用
● token的身份验证流程
1)客户端使用用户名和密码请求登录;
2)服务端收到请求,去验证用户名与密码;
3)验证成功后,服务器会签发一个token,并把这个token发送给客户端;
4)客户端收到token后,会把它存储起来,比如放在cookie或者localStorage里;
5)客户端每次向服务器请求资源的时候就会带着服务端签发的token
6)服务端收到请求后,然后去验证客户端请求里面的token值,如果验证成功,就向客户端返回请求的数据。
● 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里
● 基于 token 的用户认证是一种服务端无状态的认证方式,服务端不用存放 token 数据。用解析 token 的计算时间换取 session 的存储空间,从而减轻服务器的压力,减少频繁的查询数据库
● token 完全由应用管理,所以它可以避开同源策略

4. 什么是 JWT?

● JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。
● 是一种认证授权机制。
● JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。JWT 的声明一般被  用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。
● 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。
● JWT认证流程:
1)用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT
2)客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)
3)当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWT,其内容看起来是下面这样
Authorization: Bearer <token>
● 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
● 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了需要查询数据库的需要
● 因为 JWT 并不使用 Cookie 的,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)
● 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值