经常会有用户咨询,CDN 是否会传递 Cookie 信息,是否会对源站 Session 有影响,Token 的防盗链配置为什么总是配置失败?为此,我们就针对 Cookie、Session 和 Token,来谈谈它们的用处是什么。

Cookie

Cookie 虽然听起来不是技术名词,但却为互联网提供一项至关重要的功能:“记录访问过的网站或正在访问的网站。”

HTTP 协议是无状态的,服务器不知道浏览器上一次访问做了什么,也无法对用户会话进行跟踪连接。为此就引入 Cookie 技术,Cookie 是由服务器发送到客户端浏览器的一小段文本文件,包含了网站访问活动信息。例如首选项语言或其它一些设置。浏览器会保存这些数据,并在客户端下次访问该网站时调用它们,提供更方便和个性化的访问体验。

举个简单的例子:我们在浏览购物网站时,会将选购商品添加到购物车。如果没有 Cookie 技术,因为 HTTP 是无状态协议,它不会知道之前添加选购哪些商品,放在哪个用户的购物车中。而应用 Cookie 技术后,Cookie 才会将这些信息在会话中发送给服务器,服务器读取 Cookie 信息就知道是哪些用户购物车中添加的商品信息。

Cookie 的属性,就意味着它会暴露用户的一些隐私。Cookie 存放了客户端留在网站的信息,它会根据用户喜好和访问信息记录,推送一些用户喜欢的信息。我们在浏览网页中,常常看到在线广告,大多数在线广告就是依附 Cookie 技术对客户端浏览器进行推广,在网页中显示相关度较高的广告。

Session

Session 表示的是 C/S 架构中服务器和客户端一次会话的过程,用来保存认证用户信息。Session 是一种 HTTP 存储机制,目的是为无状态的 HTTP 提供持久机制。这样用户在应用程序的 Web 页面跳转时,就不会因为 HTTP 无状态的性质导致对话丢失,从而使访问会话一直保持下去。

服务器端存储用户数据信息。必须知道每个用户分别是谁,那么每个用户必须有个名字,或者说是 ID,这就是所谓的“Session ID”。用户请求后,服务器会生成 Session ID 并返还,后续用户的每次请求,都会带上这个 Session ID,然后服务器通过在数据库的搜索对应,找到该用户及其相关信息,比如对应的用户是登录状态还是超时登出之类的。

信息状态存在服务器端,用户只需要留存 Session ID。大多数时候通过 Cookie 传递存放,当然也可以用 ajax 传,存 Local Storage 或 Session Storage 或 IndexDB 或 Web SQL,反正只要用户拿到并存着就行,甚至可以用 URL 重写的方式传递。

比如:二狗子在 www.a.com/login.php 网站中登陆,同时希望 www.a.com/index.php 也是登陆状态。但这是两个不同的页面和 HTTP 请求,并且 HTTP 是无状态协议,是无关联的,也就无法在 /index.php 中读取 /login.php 登陆状态。于是我们就可以依靠 Session 会话技术,它通过保持会话的方式,将多次 HTTP 请求关联到一个会话中,保持数据传输的完整性。

Token

Token 是“令牌”的意思,主要是用于身份的验证方式。以又拍云的 Token 防盗链为例,Token 通过对时间相关的字符串进行签名,将时间、签名信息通过一定的方式传递给 CDN 节点服务器作为判定依据,CDN 边缘节点依据约定的算法判断来访的 URL 是否有访问权限。如果通过,执行下一步;如果不通过,响应 HTTP 403 状态码或者通过 302 跳转到其他 URL。

如上图所示,整个 Token 防盗链的实现需要如下几个部分来配合:

  • 客户端:负责发送原始请求给客户端业务服务器以及发送带签名的 URL 给 CDN 节点进行验证;

  • 业务服务器:根据约定的算法生成带 _upt 参数的 URL 返回给客户端;

  • CDN 节点:负责和客户端进行时间、签名校验;

Token 的实现方式

在了解 Token 实现需要客户端、服务器端、CDN 节点来配合后,再来简单看下 Token 具体是如何实现的:

步骤1:客户端业务服务器生成验证信息,验证信息的生成由业务服务器负责,具体的加密过程需要确认如下事项:

  • 确认过期时间的格式,默认采用 UNIX 时间戳格式

  • 确认验证信息中的密文,用户计算验证信息,需要和 CDN 平台约定

  • 确认验证信息时加入的参数,默认为 URL 的路径部分

  • 根据上文的算法说明计算验证信息,其中请求 URL 中的验证参数为 _upt

步骤2:CDN 节点验证过程

  • 根据约定解析取出过期时间,和当前 CDN 节点服务器时间进行比较,确认请求是否过期

  • 根据上文约定好的算法计算方式,计算出 MD5 加密串后,和 URL 中的加密串进行比较,验证加密串是否一致

如果以上两个步骤都验证通过,请求才会被认为是合法的,这时 CDN 会请求资源响应给客户端,否则会被认为是非法请求,直接响应 HTTP status code 403。

最后,做下简单的总结:

Cookie 存放在客户端,用来保存客户端会话信息。由于存储在客户端,它的安全性不能完全保证。

Session 存放在服务器端,用户验证客户端信息。如果把 Cookie 比喻成电话号码,那么 Session 就是记录所有人信息的电话簿。由于存储在服务器,安全性有一定的保证。

Token 是一种认证方式。通过预定的规则来计算 Token 值并发送给服务器进行访问验证。

读完这篇文章,我相信你已经对 Cookie、Session、Token 有详尽的了解了。

推荐阅读

Apache APISIX 微服务网关极致性能架构解析

为什么 HTTPS 比 HTTP 安全

3 分钟带你深入了解 Cookie、Session、Token的更多相关文章

  1. cookie, session, token 是什么 以及相应的安全考量

    Cookie cookie 最常见的是用来保存一些账号信息,比如下图里的 记住账号 就是记录到了cookie里面 cookie 更主要的是针对和server通信的,我们知道http 是无状态的,那如果 ...

  2. Python Web学习笔记之Cookie,Session,Token区别

    一.Cookie,Session,Token简介 # 这三者都解决了HTTP协议无状态的问题 session ID or session token is a piece of data that i ...

  3. cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

  4. cookie,session,token介绍

    本文目录 发展史 Cookie Session Token 回到目录 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, 不需要记录谁在某一段时间里都浏览了什么文档 ...

  5. django基础之day10,cookie session token

    https://www.cnblogs.com/Dominic-Ji/p/10886902.html cookie session token

  6. cookie & session & token compare

    cookie & session & token compare cookie.session.token 区别和优缺点 存储位置 cookie 存在 client 端 session ...

  7. cookie,session,token的理解

    Get  POST 区别异同点 淘宝token的 理解   过程算法 防止伪造请求  伪造相对难 简单发展史  登录的操作: 哪些人往自己的购物车中放商品,  也就是说我必须把每个人区分开,这就是一个 ...

  8. cookie,session,token的定义及区别

    参考了很多文章总结的. 1.cookie(储存在用户本地终端上的数据) 服务器生成,发送给浏览器,浏览器保存,下次请求同一网站再发送给服务器. 2.session(会话) a.代表服务器与浏览器的一次 ...

  9. cookie session token

    HTTP    HTTP是无状态(stateless)的网络协议.HTTP协议自身不对请求和响应之间的通信状态进行保存.也就是说HTTP协议对于发送过的请求或响应都不做持久化处理. 为了实现保持状态功 ...

随机推荐

  1. Python--day20--模块的导入

    1,模块的导入步骤: 2,,给文件起别名的用处: 重命名之后,原来的名字就不能用了 3,虽然这样写可以,但是不推荐,代码可读性不强,以后代码的修改成本也增加: 4,模块的导入顺序: 5,导入变量名的两 ...

  2. H3C 配置Basic NAT

  3. pycharm解析器找不到

    pycharm每个项目都需要设定解释器位置吧,把自己解释器位置添加到项目设置就好了 先装python,再装pycharm,不然找不到解析器的,解析器其实就是python.exe.

  4. P1108 分解质因数

    题目描述 给你一个正整数 \(n\) ,请给 \(n\) 分解质因数,并按照样例输出的格式输出对应的结果. 输入格式 输入包含一个正整数 \(n (2 \le n \le 10^9)\) . 输出格式 ...

  5. 【t002】jam的计数法

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世 ...

  6. H3C 环路避免机制六:触发更新

  7. 装饰器&偏函数与作用域与异常处理与文件读写

    装饰器 概念:是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 简单的装饰器 def func1(): print("sunck is a good man& ...

  8. Linux 内核提交和控制一个 urb

    当驱动有数据发送到 USB 设备(如同在驱动的 write 函数中发生的), 一个 urb 必须被 分配来传送数据到设备. urb = usb_alloc_urb(0, GFP_KERNEL); if ...

  9. 一个vue管理系统的初步搭建总结

    ps:目前这个项目只是有一个大致的框架,并没有做完 前期准备工作 前端构建工具:Visual Studio Code后端构建工具:IDEA数据库和服务器构建工具:WampServer (使用的是2.4 ...

  10. 复盘:错误理解zuul路径匹配,无法使用zuul

    场景: 项目中用到zuul时,配置url总是有问题,无法路由到对应微服务. 配置如下: zuul: routes: m2-member: path: /member/* serviceId: m2-m ...