HTTP协议本身是无状态的,所以需要一个标志来对用户身份进行验证

身份验证方式

  • 基于cookie的身份验证
    • Cookie
    • Session
    • 应用场景
    • CSRF
  • 基于token的身份验证
    • CORS
    • token相对于cookie的优势

基于cookie的身份验证

Cookie

Cookie 是客户端的存储空间,由浏览器来维持。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。

Cookie 是服务器生成并发送给客户端,且由客户端来保存的。每次请求都需要加上 Cookie。服务器端收到客户端发送的 Cookie 后,从数据库中寻找相应的sessionid,检查究竟是从哪一个客户端发来的连接请求,得到状态信息。
单个Cookie 在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能超过3K

Session

Session 保存在服务器中,使用Cookie 作为识别标志。HTTP协议是无状态的,Session 不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为 JSESSIONID 的 Cookie,它的值为该 Session 的 id(即放在HTTP响应报文头部信息里的Set-Cookie)。Session依据该 Cookie 来识别是否为同一用户。

基于cookie的验证是有状态的,就是说验证或者会话信息必须同时在客户端和服务端保存。这个信息服务端一般在数据库中记录,而前端会保存在cookie中。

应用场景

  1. 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
  2. session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session。

基于cookie的身份验证方式很容易受到CSRF(防跨站请求伪造)攻击,因此需要使用基于token的身份验证方式

CSRF

跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

攻击过程举例:
       假设你已经通过银行的验证并且cookie中存在验证信息,同时银行网站没有CSRF保护。一旦用户点了这个图片(连接为【http://bank.com?withdraw=1000&to=tom】),就很有可能从银行账户向tom转1000块钱。

防止CSRF攻击的方式:

  1. 验证码
  2. Token
     如果银行网站使用了token作为验证手段,攻击者将无法通过上面的链接转走你的钱。(因为攻击者无法获取正确的token)

详见怎么防止跨站请求伪造攻击(CSRF)?

基于token的身份验证

当讨论基于token的身份验证时,一般都是说的JSON Web Tokens(JWT)。虽然有着很多不同的方式实现token,但是JWT已经成为了事实上的标准,所以后面会将JWT和token混用。

请求登录时,token和sessionId原理相同,是对key和key对应的用户信息进行加密后的加密字符,登录成功后,会在响应主体中将{token:‘字符串’}返回给客户端。客户端通过cookie、sessionStorage、localStorage都可以进行存储。再次请求时不会默认携带,需要在请求拦截器位置给请求头中添加认证字段Authorization携带token信息,服务器端就可以通过token信息查找用户登录状态。

       JWT是一种无状态的认证机制,因为用户状态永远不会保存在服务器内存中。服务器不记录哪些用户已登陆或者已经发布了哪些JWT。对服务器的每个请求都需要带上验证请求的token。该标记既可以加在header中,可以在POST请求的主体中发送,也可以作为查询参数发送。服务器的受保护路由将在授权头中检查有效的JWT,如果存在,则允许用户访问受保护的资源。由于JWT是自说明的,包含了所有必要的信息,这就减少了多次查询数据库的需要。

这样可以完全依赖无状态的数据API,甚至可以向下游服务发出请求。API的作用域并不重要,因此跨源资源共享(CORS)不会是一个问题,因为它不使用Cookie。

CORS

  CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

浏览器将CORS请求分成两类:

  • 简单请求(simple request)
      对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求:

    • 如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应;
    • 如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。
  • 非简单请求(not-so-simple request)
      非简单请求是那种对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json。
      非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight。
      浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
       "预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

详见 跨域资源共享 CORS 详解.


token相对于cookie的优势

  1. 基于token的验证是无状态的,这也许是它相对cookie来说最大的优点。后端服务不需要记录token。每个令牌都是独立的,包括检查其有效性所需的所有数据,并通过声明传达用户信息。
    服务器唯一的工作就是在成功的登陆请求上签署token,并验证传入的token是否有效。
  2. 支持跨域访问,cookie会绑定到单个域。foo.com域产生的cookie无法被bar.com域读取。使用token就没有这样的问题。这对于需要向多个服务获取授权的单页面应用程序尤其有用。
    使用token,使得用从myapp.com获取的授权向myservice1.com和myservice2.com获取服务成为可能。
  3. 更适用于移动端 (Android,iOS,小程序等等),像这种原生平台不支持cookie,比如说微信小程序,每一次请求都是一次会话。
  4. 性能更好,效率更高,一次网络往返时间(通过数据库查询session信息)总比做一次HMACSHA256计算的Token验证和解析要费时得多。
  5. 避免CSRF跨站伪造攻击 ,还是因为不依赖cookie;

参考:
token和session的区别 .
Cookie和Token.
前后端分离 token和cookie对比.

Cookie、Session和Token(学习笔记)相关推荐

  1. 登录状态保持(cookie+session和token)

    http设计之初,登录状态保持, 就是无状态的,这段时间业务逻辑也非常简单,随着互联网时代的来临,用户量的增加,每次登录却无法状态保持,先出现了cookie,但是cookie存储在客户端的浏览器上,并 ...

  2. Cookie + Session登录-Token登录-SSO 单点登录-OAuth 第三方登录

    文章目录 1.Cookie + Session 登录 2. Cookie + Session 存在的问题 3.Token 登录认证 1. Token 机制实现流程 2. Token 机制的特点 3. ...

  3. JAVA实现Token学习笔记001--Token入门案例

    Java大白话-–Token入门案例 Token入门案例今天为大家介绍一下Token的基本原理(以最直白的方式) 两片同样的钥匙 这是一家神奇的酒店,所有的客房居然都没有钥匙孔,可是每间房们前都做着一 ...

  4. token学习笔记(JWT、jjwt的使用及案例实现)

    文章目录 1. 首先.了解什么是会话 2. 会话跟踪的主要技术 3. Token 令牌学习 3.1 流程图 3.2 token 3.3 JWT(JSON web Tokens)Json web 令牌( ...

  5. java中session对象登录_JavaWeb中Session对象的学习笔记

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  6. 【学习笔记】cookie、session、token和分布式session

    文章目录 cookie和Session session和token cookie和token总结 分布式Session cookie和Session 为什么要有session的出现? 答:是由于网络中 ...

  7. 【全栈接口测试进阶系列教程】精通api接口测试,接口分类,接口架构,http,webservice,dubbo接口协议,接口流程,接口工具,cookie,session,token接口鉴权原理以及实战

    目录 一,[什么是接口测试?为什么要作接口测试] 1.接口的作用 2.为什么要做接口测试 3.接口都有哪些类型? 二,[接口测试的分类] 接口的分类: http和webservice接口区别: 三,[ ...

  8. 还分不清 Cookie、Session、Token、JWT?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:掘金   作者:秋天不落叶 juejin.im/po ...

  9. Spring Session - Cookie VS Session VS Token 以及 Session不一致问题的N种解决方案

    文章目录 Cookie VS Session VS Token History Cookie Session Token Session不一致问题 Session不一致解决方案 nginx sessi ...

最新文章

  1. PJ:细菌挥发性物质和光合信号激活低铁响应途径
  2. java卡片布局例子_Java编程使用卡片布局管理器示例【基于swing组件】
  3. java职业发展路线图_软开(Java),该如何规划职业路线?
  4. 完整的可按年份和月份查询数据并显示
  5. 布丁机器人APP响应超时_常见问题解答
  6. 结合中断分析TCP/IP协议栈在LINUX内核中的运行时序
  7. 综述-自动驾驶中基于图像的3D目标检测
  8. 新手抖音直播需要什么设备;看完让你少花冤枉钱。
  9. ae效果英文版翻译对照表_AE表达式中英文对照表.doc
  10. SQL Server数据类型一览表
  11. PDF文件阅读器迷你绿色纯净版3.4 和《电脑爱好者》2015年PDF 更新至18期
  12. python中 s是什么意思_python中字符串 s[ : -1]是什么意思?
  13. stl文件html预览,【stl文件在线预览】示例源码
  14. 性能第三讲:百万级QPS,支撑淘宝双11需要哪些技术
  15. PDF图片文字如何编辑?ORC图文识别一招搞定
  16. 补充:python实现二叉树里面求叶子节点的算法
  17. 最快的 TCP 拥塞控制算法
  18. 智能微型RTU通讯设备的特点及应用领域,你都了解吗?
  19. 逆向分析某office插件
  20. Python 常用编程方法

热门文章

  1. 键盘各种按键对应的ASII码
  2. 垃圾小白羊的leetcode刷题记录7
  3. mysql期末作业_MySql期中作业
  4. java后台导出pdf,基础用法和样例
  5. 因果AI热度背后的打靶迷局
  6. mysql学习应用_MySQL学习从这里出发!
  7. 拼多多现重大Bug,一晚被薅羊毛数千万!
  8. 阿里云ACP认证之云服务器ECS知识整理(考题占比 31%)
  9. pandas数据拼接
  10. 修改Egg.js端口号