Session、Token、Jwt、Oauth2 区别和原理详解

2023-05-16

1.认证(Authentication)

        通俗的说就是验证当前用户的身份,证明你是你自己。

2.授权(Authorizatio)

用户授予第三方应用访问该用户某些资源的权限。

实现授权的方式分为:

  • cookie

  • session

  • token

  • OAuth

3.什么是Cookie

  • HTTP是无状态的协议(对于事务处理没有记忆能力,每次客户端和服务端会话完成时,服务端不会保存任何会话信息):每个请求都是独立的,服务端无法分辨上一次的请求发送这和这一次的发送者是不是同一个人。所以服务器与浏览器为了进行会话跟踪,就必须主动的去维护一个状态,【这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过cookie或者session去实现】。

  • cookie存储在客户端:cookie是服务器发送到用户浏览器并保存在本地的一小块数据,他会在浏览器下次向同一服务器再次发起请求时被携带并发送到服务器上。

  • cookie是不可以跨域的:每个cookie都会绑定单一的域名,无法在别的域名下获取使用,一级域名和二级域名之间是允许共享使用的(依靠的是domain)。

4.什么是 Session

  • session 是另一种记录服务器和客户端会话状态的机制

  • session 是基于 cookie 实现的

  • session 存储在服务器端sessionId 会被存储到客户端的cookie 中

  • session 认证流程:

        用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session

        请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器

        浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名

        当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作

      根据以上流程可知,SessionID 是连接 Cookie 和 Session 的一道桥梁,大部分系统也是根据此原理来验证用户登录状态。

5.Cookie 和 Session 的区别

  • 安全性:Session 比 Cookie 安全,Session 是存储在服务器端的,Cookie 是存储在客户端的。

  • 存取值的类型不同:Cookie 只支持存字符串数据,想要设置其他类型的数据,需要将其转换成字符串,Session 可以存任意数据类型。

  • 有效期不同:Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般失效时间较短,客户端关闭(默认情况下)或者 Session 超时都会失效。

  • 存储大小不同:单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。

6.什么是 Token(令牌)

  Acesss Token

  • 访问资源接口(API)时所需要的资源凭证

  • 简单 token 的组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)

  • 特点:

    • 服务端无状态化、可扩展性好

    • 支持移动端设备

    • 安全

    • 支持跨程序调用

  • token 的身份验证流程:

  1. 客户端使用用户名跟密码请求登录

  2. 服务端收到请求,去验证用户名与密码

  3. 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端

  4. 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里

  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 token

  6. 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据

  • 每一次请求都需要携带 token,需要把 token 放到 HTTP 的 Header 里

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

  • token 完全由应用管理,所以它可以避开同源策略

    Refresh Token

  • 另外一种 token——refresh token

  • refresh token 是专用于刷新 access token 的 token。如果没有 refresh token,也可以刷新 access token,但每次刷新都要用户输入登录用户名与密码,会很麻烦。有了 refresh token,可以减少这个麻烦,客户端直接用 refresh token 去更新 access token,无需用户进行额外的操作。

  • Access Token 的有效期比较短,当 Acesss Token 由于过期而失效时,使用 Refresh Token 就可以获取到新的 Token,如果 Refresh Token 也失效了,用户就只能重新登录了。

  • Refresh Token 及过期时间是存储在服务器的数据库中,只有在申请新的 Acesss Token 时才会验证,不会对业务接口响应时间造成影响,也不需要向 Session 一样一直保持在内存中以应对大量的请求。

7.Token 和 Session 的区别

  • Session 是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。而 Token 是令牌,访问资源接口(API)时所需要的资源凭证。Token 使服务端无状态化,不会存储会话信息。

  • Session 和 Token 并不矛盾,作为身份认证 Token 安全性比 Session 好,因为每一个请求都有签名还能防止监听以及重放攻击,而 Session 就必须依赖链路层来保障通讯安全了。如果你需要实现有状态的会话,仍然可以增加 Session 来在服务器端保存一些状态。

  • 所谓 Session 认证只是简单的把 User 信息存储到 Session 里,因为 SessionID 的不可预测性,暂且认为是安全的。而 Token ,如果指的是 OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对 App 。其目的是让某 App 有权利访问某用户的信息。这里的 Token 是唯一的。不可以转移到其它 App上,也不可以转到其它用户上。Session 只提供一种简单的认证,即只要有此 SessionID ,即认为有此 User 的全部权利。是需要严格保密的,这个数据应该只保存在站方,不应该共享给其它网站或者第三方 App。所以简单来说:如果你的用户数据可能需要和第三方共享,或者允许第三方调用 API 接口,用 Token 。如果永远只是自己的网站,自己的 App,用什么就无所谓了

 

8.什么是JWT

  • JSON Web Token(简称 JWT)是目前最流行的跨域认证解决方案。

  • 是一种认证授权机制。

  • JWT 是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519)。JWT 的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。

  • 可以使用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。因为数字签名的存在,这些传递的信息是可信的。

  • JWT 认证流程:

  • 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT

  • 客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)

  • 当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWT,其内容看起来是下面这样

  • 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为

  • 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了需要查询数据库的需要

  • 因为 JWT 并不使用 Cookie 的,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)

  • 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制

     

        JWT组成

1,头部


一个json字符串,包含当前令牌名称,以及加密算法

{"typ":"JWT","alg":"HS256"}

使用base64加密

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9


2,载荷


一个json字符创,包含一些自定义的信息,

{"sub":"1234567890","name":"John Doe","admin":true}


使用base64加密

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9


3,签名


由头部信息使用base64加密之后,拼接上载荷使用base64加密之后的部分,在加上当前的密钥,进行头部中的加密算法进行加密

header (base64后的)

payload (base64后的)

secret


这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ


将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lI

9.Token 和 JWT 的区别

相同:

  • 都是访问资源的令牌

  • 都可以记录用户的信息

  • 都是使服务端无状态化

  • 都是只有验证成功后,客户端才能访问服务端上受保护的资源

区别:

  • Token:服务端验证客户端发送过来的 Token 时,还需要查询数据库获取用户信息,然后验证 Token 是否有效。

  • JWT:将 Token 和 Payload (载荷)加密后存储于客户端,服务端只需要使用密钥解密进行校验(校验也是 JWT 自己实现的)即可,不需要查询或者减少查询数据库,因为 JWT 自包含了用户信息和加密的数据

10.常见的前后端鉴权方式

  • Session-Cookie

  • Token 验证(包括 JWT,SSO)

  • OAuth2.0(开放授权)

11.常见的加密算法

  • 哈希算法(Hash Algorithm)又称散列算法、散列函数、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。哈希算法将数据重新打乱混合,重新创建一个哈希值。

  • 哈希算法主要用来保障数据真实性(即完整性),即发信人将原始消息和哈希值一起发送,收信人通过相同的哈希函数来校验原始数据是否真实。

  • 哈希算法通常有以下几个特点:

    正像快速:原始数据可以快速计算出哈希值

    逆向困难:通过哈希值基本不可能推导出原始数据

    输入敏感:原始数据只要有一点变动,得到的哈希值差别很大

    冲突避免:很难找到不同的原始数据得到相同的哈希值,宇宙中原子数大约在 10 的 60 次方到 80 次方之间,所以 2 的 256 次方有足够的空间容纳所有的可能,算法好的情况下冲突碰撞的概率很低:

    • 2 的 128 次方为 340282366920938463463374607431768211456,也就是 10 的 39 次方级别

    • 2 的 160 次方为 1.4615016373309029182036848327163e+48,也就是 10 的 48 次方级别

    • 2 的 256 次方为 1.1579208923731619542357098500869 × 10 的 77 次方,也就是 10 的 77 次方

注意事项

1.以上不能保证数据被恶意篡改,原始数据和哈希值都可能被恶意篡改,要保证不被篡改,可以使用RSA 公钥私钥方案,再配合哈希值。

2.哈希算法主要用来防止计算机传输过程中的错误,早期计算机通过前 7 位数据第 8 位奇偶校验码来保障(12.5% 的浪费效率低),对于一段数据或文件,通过哈希算法生成 128bit 或者 256bit 的哈希值,如果校验有问题就要求重传。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Session、Token、Jwt、Oauth2 区别和原理详解 的相关文章

  • iNavFlight之MSP DJI协议飞控端请求应答

    iNavFlight之MSP DJI协议飞控端请求应答 1 报文格式2 报文标志 flag 3 报文命令 cmd 4 请求应答 amp 反馈报文4 1 DJI MSP API VERSION4 2 DJI MSP FC VARIANT4 3
  • 大疆Tello UDP控制协议接口

    大疆Tello UDP控制协议接口 1 设计架构2 UDP报文格式2 1 控制报文2 2 查询报文2 3 状态报文 3 命令集3 1 控制报文 控制命令3 2 控制报文 设置命令3 3 查询报文 读取命令 4 状态报文 这里介绍了大疆Tel
  • 蓝牙无线自制串口模块连接穿越机配置工具

    蓝牙无线自制串口模块连接穿越机配置工具 1 目的2 验证环境3 BLE SPP验证4 BT SPP验证5 参考资料6 补充资料 windows10配置全过程截图6 1 添加设备 搜索蓝牙串口设备6 2 连接 选中SnapAirUnit设备6
  • 传感模块:MATEKSYS Optical Flow & LIDAR 3901-L0X

    传感模块 xff1a MATEKSYS Optical Flow amp LIDAR 3901 L0X 1 模块介绍2 规格参数3 使用方法Step1 接线方式Step2 安装方式Step3 使用范围 4 存在问题 思考 4 1 MATEK
  • iNavFlight之MSP v2 Sensor报文格式

    iNavFlight之MSP v2 Sensor报文格式 1 MSP v2传感报文介绍2 MSP v2协议格式3 MSP v2传感代码流程4 MSP v2 传感器4 1 光流传感报文 MSP2 SENSOR RANGEFINDER4 2 测
  • 自制肥鲨HDO2电源降压延长线,支持3S~6S动力电池

    自制肥鲨HDO2电源降压延长线 xff0c 支持3S 6S动力电池 1 问题源由2 破题思路2 1 10元大钞搞定2 2 两个毛爷爷搞定 3 解决方案4 最终延长线产出4 1 裸照4 2 成品 5 花絮6 参考资料 1 问题源由 源由 xf
  • java中for、foreach、stream性能比较

    在开发中循环遍历一个数组经常会用到 xff0c jdk8推出了一些新特性 xff0c 对循环做了比较 xff0c 通过代码亲测 xff0c 记录一下 xff01 1 for循环 public static void main String
  • 自制肥鲨HDO2电源升压延长线

    自制肥鲨HDO2电源升压延长线 1 问题源由2 解决方案3 材料准备4 最终延长线产出4 1 裸照4 2 成品 5 参考资料 1 问题源由 之前我们介绍了 自制肥鲨HDO2电源降压延长线 xff0c 支持3S 6S动力电池 xff0c 主要
  • iNavFlight之RC遥控MSP协议

    iNavFlight之RC遥控MSP协议 1 RC摇杆MSP协议2 地面站配置 amp MSP遥控器2 1 iNav地面站 配置2 2 iNav地面站 MSP遥控器 3 RC摇杆总体逻辑框架3 1 摇杆信息获取3 2 摇杆信息处理3 3 摇
  • iNavFlight之RC遥控CRSF协议

    iNavFlight之RC遥控CRSF协议 1 遥控器电传框架设计1 1 场景分析1 2 逻辑框架1 2 1 电传信息获取1 2 2 电传信息处理1 2 3 电传初始化 1 3 模块化设计 2 CRSF电传报文2 1 CRSF电传报文格式2
  • iNavFlight之电传MAVLink协议

    iNavFlight之电传MAVLink协议 1 业务逻辑框架2 MAVLink电传报文2 1 MAVLink电传报文格式2 2 iNav支持地面站报文 接收 2 3 iNav支持飞控报文 发送 3 MAVLink报文处理4 参考资料 本章
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • SVN工程转Git工程&Github托管

    SVN工程转Git工程 amp Github托管 1 介绍2 autoAudioTest之SVN转Github步骤Step 1 工作环境 ubuntu Step 2 安装升级必要软件Step 3 转换脚本Step 4 检查软件运行环境Ste
  • iNav飞控AOCODARC-F7MINI固件编译

    iNav飞控AOCODARC F7MINI固件编译 1 编译目标 xff08 AOCODARC F7MINI xff09 2 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4 厂家目标板
  • BetaFlight飞控AOCODARC-F7MINI固件编译

    BetaFlight飞控AOCODARC F7MINI固件编译 1 编译目标 xff08 AOCODARC F7MINI xff09 2 编译步骤Step 1 软件配置环境准备Step 2 获取开源代码Step 3 构建命令介绍Step 4
  • Google AIY Vision Kit安装及国内配置

    Google AIY Vision Kit安装及国内配置 1 AIY Vision Kit组装环节Step 1 xff1a 收集其他附件选择1 xff1a 使用AIY项目应用程序选择2 xff1a 使用显示器 鼠标和键盘 Step 2 xf
  • WiFi monitor模式的配置和运行检查(Ubuntu系统)

    WiFi monitor模式的配置和运行检查 1 WiFi monitor模式介绍2 WiFi monitor模式查看Step1 xff1a 确保计算机上有安装硬件WiFi无线网卡Step2 xff1a 安装必要的工具Step 3 xff1
  • github上的源码编译成.hpi插件

    目录 1 xff0c vim安装 安装 Maven 编译源码生成 hpi 2 xff0c windos 安装idea 安装maven idea设置maven 将github上的源码拉进并编译 成功 近期做jenkins监控github xf
  • BetaFlight统一硬件资源简单配置修改

    BetaFlight统一硬件资源简单配置修改 1 源由2 资源配置注意事项3 资源配置文件修改验证步骤Step 1 xff1a 确认硬件修改内容Step 2 xff1a 资源配置文件修改Step 3 xff1a 验证配置文件Step 4 x
  • SSH远程登录RaspberryPi命令行响应缓慢问题

    SSH远程登录RaspberryPi命令行响应缓慢问题 1 问题2 分析3 解决3 1 去掉PAM部分鉴权模块3 2 去掉sshd的DNS设置3 3 无线WiFi信号优化方法一 xff1a ifconfig操作方法二 xff1a 内核自动检

随机推荐