什么是 cookie
- HTTP 是无状态的协议:每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次请求的发送者是不是同一个客户端。服务器与浏览器为了进行会话跟踪,就必须主动的去维护一个状态,这个状态用于告诉服务端前后两个请求是否来自同一个浏览器。这个状态就需要通过 cookie 或者 session 来实现。
- cookie 存储在客户端:cookie 是服务器发送到用户浏览器,并进行保存到本地的数据,它会在浏览器下次向同一服务器再发起请求时被再一次被带到并发送到服务器上面
- cookie 是不可跨域名的:每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用
什么是 Session
- session 是区别 cookie 的另一种记录服务器和客户端会话状态的机制
- session 是基于cookie 实现的,session 存储在服务器端,sessionid 会被存储到客户端的 cookie 中
- session 认证流程
- 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 session
- 服务器响应客户端的请求,并返回唯一标识信息 sessionid 给浏览器
- 浏览器把返回的 sessionid 存储到 cookie 中,同时 cookie 记录次 sessionid 属于哪个域名
- 当用户第二次访问服务器的时候,请求自动判断此域名下是否存在 cookie 信息,如果存在就将 cookie 信息发送给服务端,服务端会从 cookie 中获取 sessionid,再根据 sessionid 查找对应的 session 信息,如果找到 session 证明用户已经登录,可以执行后面操作,如果没有找到,说明用户没有登录或者失败。
cookie 和 session 的区别
- 安全性:session 比 cookie 安全,session 是存储在服务器端,cookie 是存储在客户端
- 存储值的类型不同:cookie 只支持存字符串数据,设置为其它类型的数据,需要将其转换成字符串,session 可以存任意数据类型。
- 有效期不同:cookie 可设置为长时间保持,session 的失效时间比较短,客户端关闭就会失效
- 存储大小不同:单个 cookie 保持的数据不能超过 4KB,Session 存储数据高于 cookie,当访问量过多,会占用更多的服务器资源。
什么是 Token(令牌)
- 访问接口(API)时所需要的资源凭证,比如订单接口需要带上登录返回的 token 值,才能访问订单接口数据
- 常见的 token 组成:UID(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token+ 请求数据进行几次 md5 之后的值)
- token 的特点:
- 服务端无状态化、可扩展性好
- 支持移动端设备
- 安全性好
- 支持跨程序调用
- token 的身份验证流程:
①、客户端使用用户名和密码,请求登录
②、服务端收到请求,验证用户名和密码
③、验证成功之后,服务端返回一个 token,并把这个 token 发送给客户端
④、客户端收到 token 之后,会把它存储起来,放入 cookie 里面
⑤、客户端每次想服务器请求资源的时候,都需要带着这个 token
⑥、服务端收到请求的时候,验证客户端请求里面带着的 token,如果验证成功,就向客户端返回请求的数据
- 每一次请求都需要携带 token,需要把 token 放到 HTTP 的请求头里面
- 基于 token 的用户认证,服务端不用存放 token 数据。
Token 和 session 的区别
- Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。
- token 是一种令牌,访问接口(API)时需要的凭证,也像古代进入到城里需要腰牌一样。token 使服务器无状态化,不会存储会话信息。
- token 的安全性要好于 session,每次请求都有签名,也就会出现每次的 token 都会变化,也可以防止一定的攻击、
什么是 JWT
- JSON Web Token(简称 JWT)是目前最流行的跨越认证解决方案。
- 是一种认证授权机制
- JMT 是在网络应用环境之间传递声明,而执行的一种基于 JSON 的开发标准
JWT 的认证流程:
- 客户端将 token 保存到本地(通常使用 localstorge)
- 当用户访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用 Bearer 模式添加 JWT
- 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
- JWT 内部保护了一些会话信息,减少了需要查询数据库的需要
- JWT 并不使用 cookie,可以使用任何域名提供你的 API 服务,不需要担心跨域的问题
- 用户的状态不存储在服务端的内存中,是一种无状态的认证机制
Token 和 JWT 的区别
相同点:
- 都是访问资源的令牌
- 都可以记录用户的信息
- 都是使服务端无状态化
- 都是只有验证成功后,客户端才能访问服务端上受保护的资源
两者的区别:
- Token:服务端验证收到客户端发送过来的 token 时,需要查询数据库获取用户信息,验证 Token 是否有效
- JWT:将 Token 和请求信息加密后存储在客户端,服务端只需要使用密钥进行校验即可,不需要查询或者减少查询数据库,因为 JWT 自己包含了用户信息和加密的数据
常见的前后端鉴权方式:
Session-Cookie
Token 验证(包括 JWT,sso)
Oauth2.0
转载自:https://www.bilibili.com/read/cv8560814/