Http 协议是一个无状态协议, 客户端每次发出请求, 请求之间是没有任何关系的。但是当多个浏览器同时访问同一服务时,服务器怎么区分来访者哪个是哪个呢?

cookie、session、token 就是来解决这个问题的。

cookie

  • cookie 仅仅是浏览器实现的一种数据存储功能,就是浏览器里面能永久存储的一种数据
  • 浏览器每次发生http请求,都会将请求域的 cookie 一同发给 server 端
  • server 端可以修改 cookie 并返回给浏览器
  • 浏览器端也可以通过 js 修改 cookie, 但是是有限制的,例如记录用户登录数据的某些 cookie 是禁止浏览器端随意修改的

session

如果说 cookie 是客户身上的“通行证”,那么 session 就是服务器上的“客户明细表”。客户第一次访问服务器,服务器会保存客户的信息,并给客户一个 cookie,下一次客户携带 cookie 访问服务器时,服务器会通过该 cookie 在客户明细表(session)中找出该用户信息,服务器就知道是哪个在访问了。

  • session 只保存在服务器上,是服务器端使用的一种记录客户端状态的机制
  • session 的使用方式是:客户端 cookie 里存 userid,服务端 session 存用户数据,客户端访问服务端的时候,根据 userid 找对应用户数据

token

token 也称作令牌, 注意在客户端里存 userid(也就是token)、用户信息、密文,而服务端只有一段加密代码,用来判断当前加密后的密文是否和客户端传递过来的密文一致,如果不一致,就是客户端的用户数据被篡改了,如果一致,就代表客户端的用户数据正常且正确。

token 在客户端一般存放于localStorage,cookie,或sessionStorage中。在服务器一般存于数据库中。token 组成:

· uid: 用户唯一身份标识
· time: 当前时间的时间戳
· sign: 签名, 使用 hash/encrypt 压缩成定长的十六进制字符串,以防止第三方恶意拼接
· 固定参数(可选): 将一些常用的固定参数加入到 token 中是为了避免重复查库

token 认证流程与 cookie 类似:

1. 用户登录,成功后服务器返回Token给客户端。
2. 客户端收到数据后保存在客户端
3. 客户端再次访问服务器,将 token 放入 headers 中
4. 服务器端校验。校验成功则返回请求数据,校验失败则返回错误码(401)

redis:

redis 和 mysql 区别

  • redis 是 web server 最常用的缓存数据库,数据存放在内存中, 可存储的数据量较小,但是读取速度较快
  • 相比于 mysql, mysql 是关系型数据库,存储在硬盘中,可存储的数量较大,但是读取速度较慢
  • redis 和 mysql 一般配合使用

为何 session 或 token 更适合存储在 redis

  • session 或 token 访问频繁,对性能要求极高
  • session 或 token 不必但是丢失数据(丢失后,用户只需要重新登录即可)
  • 与其他存储在 mysql 中的数据相比,session 或 token 的数据量较小

为何其他网站数据不适合存储在 redis

  • 防止数据丢失
  • 数据量大,内存成本高
  • 操作频率不高

理解 Cookie,Session,Token 并结合 Redis 的使用的更多相关文章

  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. django基础之day10,cookie session token

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

  5. cookie,session,token介绍

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

  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. Jmeter的代理和cookie/session/Token令牌认证

    Jmeter的代理服务器 1.启动Jmeter: 2.“测试计划”中添加“线程组”: 3.“工作台”中添加“HTTP代理服务器”: 4.配置代理服务器:Global Settings下面的端口配置:9 ...

  10. 一文搞懂Cookie,Session,Token,JWT

    HTTP协议是无状态的,无状态意味着,服务器无法给不同的客户端响应不同的信息.这样一些交互业务就无法支撑了.Cookie应运而生. Cookie 通过F12开发者工具,先瞅瞅Cookie的颜值 从图中 ...

随机推荐

  1. 运维笔记--给正在运行的Docker容器动态绑定卷组(挂载指定目录)

    场景描述: 操作系统: ubuntu16.04, docker版本: Docker version 19.03.1 系统运行一段时间后,该服务器上有一个运行中docker容器,需要在容器里边挂载本地服 ...

  2. LiveCD 修复Grub引导

    /usr/sbin/grub-probe: error: failed to get canonical path of /cow 如果你是从这句报错search过来的,恭喜您!看来你也是一个调皮的孩 ...

  3. Golang常见小细节总结(1)

    本系列不定期更新,用于记录平常开发过程中出现的一些小问题 Array 类型的值作为函数参数    可以理解slice是对array的一个视图,底层还是array所以会被修改 通过map的ok来确 ...

  4. mysql新增用户

    新开了个项目,数据库也想新搞个用户,先登陆mysql,看看原来都有哪些: root@wlf:/# mysql -uroot -p Enter password: Welcome to the MySQ ...

  5. mysql的全量备份与增量备份

    mysql的全量备份与增量备份 全量备份:可以使用mysqldump直接备份整个库或者是备份其中某一个库或者一个库中的某个表. 备份所有数据库:[root@my ~]# mysqldump -uroo ...

  6. Laya的List组件+滚动条

    版本:2.2.0 下面以<绯雨骑士团>的服务器选择列表为例子. 一 创建List 首先创建一个List组件,我命名为serverList. (不用像laya教程里那样,还要转换类型什么的, ...

  7. 第一本docker书 学习笔记(一)

    Docker的核心组件: Docker客户端和服务端 Docker镜像 Registry Docker容器 # Docker客户端和服务端 docker 是一个 C/S架构程序.客户端只需要向dock ...

  8. 和至少为K的最短子数组

    返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A =  ...

  9. 解决org.springframework.web.multipart.MaxUploadSizeExceededException

    今天在spring boot2X 里做文件上传遇到了如下错误 org.springframework.web.multipart.MaxUploadSizeExceededException: Max ...

  10. perl oneline

    可参考博客:http://blog.csdn.net/carzyer/article/details/5117429 Perl常用命令行参数概览 -e 指定字符串以作为脚本(多个字符串迭加)执行 -M ...