HTTP 是无状态的协议,服务端无法确认访问者的身份。

身份认证的方式有:

  1. Authentication ,如基础认证等;
  2. Authorization, 如:Cookie、Session、Token;
  3. Credentials ,如:证书;

1. Cookie

  1. HTTP 是无状态协议,每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人;
  2. Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上;
  3. Cookie 在客户端存储,服务端不存储;

Cookie 的属性:

image.png

存在的问题:

  1. 不够安全,本地可读可写,可能被篡改;
  2. 不可跨域,和唯一域名进行绑定;
  3. 不可跨程序,如多个浏览器(现在貌似很多浏览器支持 cookie 共享了);
  4. Cookie 一般最多 40k,存储内容较少;

2. Session

  1. session 是另一种记录服务器和客户端会话状态的机制
  2. session 是基于 cookie 实现的,session 存储在服务器端,sessionId 会被存储到客户端的cookie 中;

工作机制:

image.png

  1. 用户第一次请求服务端,服务端存储 session 并生成对应的 sessionId 返回给客户端;
  2. 浏览器/客户端接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名;
  3. 用户再次请求,cookied 中带上 sessionId ,服务端通过 sessionId 查找数据库,如果存在对应的 session 则不需要进行身份认证。如果未找到则证明登录信息失效或者未登录过;

优点:

  1. session 存储在服务端,容量理论上无限制,可以存储很多东西;
  2. 存储在服务端,不容易被篡改,相对安全;

存在的问题:

  1. session 存储在服务端,一个过期时间内访问量过大时,会占用服务端过多资源;
  2. 基于 cookie 实现,无法跨域(感觉 sessionId 如果不存储在 cookie 中,那理论上也不存在跨域跨程序问题);

SessionId 为什么不能像 token 一样放在 Header 或者 Body中?

3. token

  1. 是客户端/浏览器访问资源接口(API)时所需要的资源凭证;
  2. 组成简单, token 的组成: uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
  3. 客户端存储,服务端验证,访问量大时不占用资源,服务端使用解析 token 的时间来换取资源空间;
  4. 客户端存储不一定需要绑定在 cookie 中,请求时只需要在 Header 或者 Body 中带上即可,不存在跨域问题;

token 的身份验证流程:

image.png

4. refreshToken

登录成功之后生成一个 refreshToken,同时生成一个 Token 回传到客户端,客户端对这两个 Token 都进行保存,其关系如下:

image.png

几个特点:

  1. 一对多,可以根据 refreshToken 生成多个 token;
  2. 一般业务下,任意时刻只有一个 refreshToken 和一个 token 有效;
  3. 不一定是单纯的 Map 中的 Key-Value 关系,更有可能是通过算法建立的关联;
  4. token 是根据 refreshToken 生成的;

token 和 refreshToken 中包含了很多信息,最重要的几个是:用户信息、有效期。客户端有两种类型的接口:功能性接口 + refresh 接口;

功能性接口就是业务接口,需要身份验证时直接使用 token 作为令牌来调用。后台解析 token 或者 refreshToken 获取到用户信息;

refresh 接口就是使用 refreshToken 去生成新的 token 的接口;

refreshToken 是长时间不变的,一旦发生改变则表示登录状态失效。对于 token,采用 “客户端主动刷新 token ”+ “服务端设置并检测 token 有效性” 的方式来保证 token 的刷新频率,以此来防止 token 被破解,进而保证接口调用的安全性。

总结:

  1. 客户端可以将 refreshToken 作为入参,主动调用 refresh 接口来更新 token 并存储到本地;
  2. 客户端使用 token 调用功能性接口时,服务端解析 token 中的有效期,如果失效则告诉客户端,客户端去调用 refresh 接口刷新 refreshToken;

一般 token 失效之后客户端的处理方式有两种,第一种是发送通知触发 refresh 方法。但是更好的方案是客户端调用 refresh 接口后,获取到 token 的有效期并保存,然后在有效期内固定频率地去调用 refresh 接口刷新 token 并更新,这样可以最大限度避免 token 失效的情况;

5. 总结

  1. cookie 主要问题在于跨域或者跨程序,且客户端的 cookie 容易被篡改;
  2. session 的主要问题是存储在服务端,占用过多资源,跨程序问题倒是可以通过其他手段解决;
  3. token 完美解决跨程序和存储问题,服务端使用解析时间换取存储空间,但是如果失效时间过短,失效之后需要重新登录的问题;
  4. refreshToken 通过 Key-Value 的方式和当前唯一有效的 token 建立印射。refreshToken 负责登录,失效时间很长,更新频率很低,解决了频繁登录的问题。Token 负责接口调用,失效时间短,更新频率快,解决了安全问题;

http://www.taodudu.cc/news/show-1912742.html

相关文章:

  • JSCore浅析及其在iOS上的使用
  • 编程语言的动态性(Dart和OC对比)
  • iOS:Universal Link
  • AFN中的鉴权
  • openGL ES 教程(二):渲染管线
  • MySQL(2)----DDL语句之增、删、改、查操作
  • MySQL(3)-----DML数据库操作(上)
  • 线性表的基本运算
  • MySQL(4)-----DML数据库操作(下)
  • MySQL(1)----帮助使用
  • MySQL(6)-----数据类型
  • (1)封装JSON数据的三种方式
  • (2)从文件中解析JSON数据
  • (1)I/O流对象-----FileInputStream与FileOutputStream
  • MyBatis(一)------目录
  • MyBatis(二)------使用JDBC编程问题总结
  • MySQL(5)-----DQL语句的基本查询与高级查询
  • MySQL(7)-----常用约束
  • MySQL(8)-----truncate清空表和字段自增
  • MySQL(9)-----多表创建及描述表关系(需求)
  • (1)Spring框架----通俗易懂的IoC原理
  • MySQL(10)-----多表创建及描述表关系(一对多的分析和实现)
  • MySQL(11)-----多表创建及描述表关系(多对多的分析和实现)
  • MySQL(12)-----多表查询(内连接和外连接)
  • MySQL(13)-----多表查询(子查询)
  • MySQL(14)-----运算符和优先级
  • (1)关于File类你知道多少
  • (2)I/O流对象-----FilterInputStream与FilterOutputStream
  • (3)I/O流对象-----复制图片/文件/视频的几种I/O流方式
  • Java集合源码分析(一):数组与链表

Cookie、Session、Token、RefreshToken相关推荐

  1. vue从url中获取token并加入到 请求头里_BATJ都会用到的接口鉴权cookie、session 和token...

    鉴权 鉴权是指验证用户是否拥有访问系统的权利-鉴定权限. cookie.session和token 为什么会有cookie.session和token? 1. http是无状态协议 什么是无状态呢? ...

  2. Cookie、Session 和 Token区别

    1 Cookie.Session 和 Token 都是用来做持久化处理的,目的就是让客户端和服务端相互认识.Http 请求默认是不持久的没有状态的,谁也不认识谁. 2 Cookie: 是存放在客户端的 ...

  3. cookie、session与token之间的关系

    cookie.session与token之间的关系 token 令牌,是用户身份的验证方式. 最简单的token组成:uid(用户唯一的身份标识).time(当前时间的时间戳).sign(签名). 对 ...

  4. 关于模拟登陆的小结-抓包、cookie、session和token

    概述 上个星期根据bcloud写了个Java版本的登陆项目.其实本来时想做个Linux的百度云登陆软件,但是做到获取bdstoken的时候出了问题解决不了.后来我把bcloud项目下了下来用发现也有问 ...

  5. 日常小结-关于模拟登陆的小结-抓包、cookie、session和token

    概述 上个星期根据bcloud写了个java版本的登陆项目.其实本来时想做个linux的百度云登陆软件,但是做到获取bdstoken的时候出了问题解决不了.后来我把bcloud项目下了下来用发现也有问 ...

  6. 接口鉴权之cookie、session和token

    一.鉴权 含义:鉴权就是指验证用户是否拥有访问系统的权利,即鉴定权限 二.引入cookie.session和token的原因 目前,大部分接口使用的都是HTTP协议,而HTTP协议是无状态的,即本次请 ...

  7. UNIAPP day_05(9.3) Cookie、WebStorage、Session 和 Token的区别、uni-app最终部署

    列表页"编写公式: data -- kw:"".list:[ ].pno:0.pageCount:99999.isLoading:falseloadNextPageDat ...

  8. 做web开发,怎么能不懂cookie、session和token呢?

    如果把人体比作一个web系统的话,cookie.session和token就好像人体的经络和血管一样,而web系统中的数据,就好像人体的血液一样.血液依靠着血管在人体内流动,就如数据根据cookie和 ...

  9. 海绵宝宝也懂的登录态:Cookie、Session和Token

    简介 大家都知道,HTTP是一个无状态的协议,那么Web应用要怎么保持用户的登录态呢? 如果你对cookie,session和token的优缺点不太明白,或者你想知道在实际中到底怎么实现登录态,那么本 ...

  10. cookie与session详解、url地址重写

    cookie与session详解.url地址重写:https://www.cnblogs.com/l199616j/p/11195667.html

最新文章

  1. 第十六周项目一-小玩文件(2)
  2. mongodb 3.0.x 添加用户名和密码设置权限
  3. 数学建模——智能优化之模拟退火模型详解Python代码
  4. HNCU 1328: 算法2-18~2-19:双向循环链表
  5. 运动合成——机器学习技术
  6. 学规划或GIS需要安装的软件
  7. i.e., e.g., etc.
  8. 怎么升级iOS10教程
  9. PX4 FMU [7] rgbled [转载]
  10. authware课件
  11. hg527-c CU.html,华为无线猫设置
  12. delphi7 调webservice时报错:fault occurred while processing
  13. python flag=1_python中flag什么意思
  14. 挪车电话也有商机,易扫挪车App
  15. SSD,eMMC,UFS的区别
  16. 第三方直播SDK对比|直播SDK如何选型
  17. 目前网页制作的基本语言html,第二讲网页制作基本语言HTML”.ppt
  18. python计算均值方差模型_如何从Python中的FIGARCH模型中得到条件均值和标准差?...
  19. VDI序曲三 桌面虚拟化之远程桌面服务RDS
  20. 报表查询条件的正确打开方式,看到最后不禁会心一下

热门文章

  1. cuda_error_launch_failed: unspecified launch failure
  2. 如果Service有多个实现类,Spring怎么知道该注入哪个实现类
  3. java安全证书配置
  4. 存储在U盘中的文件被误删后怎么免费恢复
  5. php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
  6. KeyShot中该怎么添加反射地平面
  7. Linux tcp_timestamps相关
  8. html文章标题加粗,织梦去除推荐文章标题加粗标签的方法
  9. cmake使用介绍【转】
  10. LAMP之PHP服务的安装(libphp7.so方式)