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. pandas.merge数据连接合并

    https://study.163.com/course/courseMain.htm?courseId=1006383008&share=2&shareId=400000000398 ...

  2. SVN 从主干合并到分支库

    主干库:平时开发用的库, 分支库:中途需要进行上生产环境的库 分支库的版本从主干库拉过去就行 红色的为分支库. 创建的速度很快. 1.创建好后,在主干库添加一个文件. 2.然后分支库进行合并,这里用e ...

  3. odoo开发笔记 -- 借助模块queue_job实现异步方法调用

    场景描述: 对比了几个定时调度的框架,发现各有优缺点: celery 很强,异步定时调度,异步周期调度,也有延时调度的功能,但是延时调度的案例比较少,遂暂时不使用. queue_job,一个odoo第 ...

  4. RabbitMQ的应用总结

    RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准 ...

  5. java concurrent并发包使用

    package cn.com.zxf.atomic; import java.util.concurrent.atomic.AtomicInteger; public class AtomicExam ...

  6. word 条件多项式公式对齐

    条件多项式公式对齐 觉得有用的话,欢迎一起讨论相互学习~Follow Me 对于使用word编写具有多个多项式的公式时,经常会有所偏移 最不优雅的方式就是使用逗号进行分隔和排版使其公式上下对齐 第二种 ...

  7. iOS - NSURLConnection finished with error - code -1002

    网络请求会异常,比如报错:Error domain: 在回调的地方打一个断点,然后用命令行查看下什么错误: po error 当错误是:**[Error Domain=NSURLErrorDomain ...

  8. 配置windows live writer

    下载地址 https://pan.baidu.com/s/1WVpLQEadIHN15W2DIhWh4A 安装流程参考博客 https://www.cnblogs.com/haseo/p/376232 ...

  9. django orm 改动数据库中已存在的表(添加、删除、修改表字段)

    python3 manage.py makemigrations --empty api # 因为我的models.py文件并直接在项目根目录,而是根目录下的api目录中 python3 manage ...

  10. 量化编程技术—pdb进行调试

    # -*- coding: utf-8 -*- # @Date: 2017-08-26 # @Original: import pdb def gen_buy_change_list(): buy_c ...