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. Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案

    Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案 Linux上启动Tomcat,结果弹出:-bash: ./startup.sh: Permi ...

  2. Xamarin.FormsShell基础教程(5)Shell项目内容新建页面

    Xamarin.FormsShell基础教程(5)Shell项目内容新建页面 轻拍内容列表页面中的Add按钮后,进入内容新建页面,如图1.4和图1.5所示.在该页面中,用户可以设置新建内容的标题和具体 ...

  3. python MySQLdb 字典(dict)结构数据插入mysql

    背景: 有时候直接操作数据库字段比较多,一个个写比较麻烦,而且如果字段名跟数据库一致,那生成为字典后,是否能直接使用字典写入数据库呢,这样会方便很多,这里简单介绍一种方法. 实例: 1. 假设数据库表 ...

  4. 卷积神经网络概念及使用 PyTorch 简单实现

    卷积神经网络 卷积神经网络(CNN)是深度学习的代表算法之一 .具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络”.随着深度学习理论的提出和数值计算设备 ...

  5. 关于linux新建用户并赋予文件夹权限和scp权限的问题

    当前用户是aaa,新建用户bbb: $adduser bbb 赋予sudo权限(即把用户bbb添加到sudo组):$usermod -a -G sudo bbb 切换到bbb:$su - bbb 假设 ...

  6. linux编译Qt+mysql驱动+可执行文件移植目标机

    前言: 如果希望自己的Qt/C++程序在目标机上运行,最简单的方法就是在目标机上安装一个Qtcreater[Qtxxx.run],然后编译release的可执行文件,直接拉起即可. 但是有些环境情况比 ...

  7. 锐捷交换机如何配置远程管理地址(telnet)

    基本命令如下: hostname(config)#username admin password 123456  ------>telnet 登录账号为admin密码为123456 hostna ...

  8. laravel5.8ajax请求auth认证返回302的解决方法。

    注册 /app/Http/Controller/Auth/RegisterController.php <?php namespace App\Http\Controllers\Auth; us ...

  9. SpringBoot读取Linux服务器某路径下文件\读取项目Resource下文件

    // SpringBoot读取Linux服务器某路径下文件 public String messageToRouted() { File file = null; try { file = Resou ...

  10. 破解MySQL登录密码的几种方法

    工具列表 Medusa Ncrack Hydra Metasploit Medusa medusa  -h 192.168.1.106 –U /root/Desktop/user.txt –P /ro ...