05 Cookie、Session、Token的区别与联系

201 阅读3分钟

1. Cookie

诞生目的:解决HTTP通信无连接、无状态所带来的问题。

误解:Cookie是缓存?

1.1 什么是Cookie?

Cookie的本质是一小段的文本信息,是一种字符串格式的字典,key=value。cookie的名称不是固定的,是由开发者自定义的

1.2 Cookie的分类

  • 会话Cookie:保存在内存,当浏览器的会话关闭之后会自动消失
  • 持久Cookie:保存在硬盘,只有当失效时间到了才会消失

1.3 Cookie的形式

5-1.png

{name:值,value:值,Domain:域名(当前cookie作用于哪一个域名),Path:路径(当前cookie作用于哪一个域名下的某个路径),expries:失效时间(session表明是会话cookie)}

1.4 Cookie鉴权原理

  1. 客户端第一次请求服务器的时候,这个时候服务器如果产生了Cookie,会通过响应头中的set-Cookie把Cookie的信息传输到客户端

5-2.png

  1. 当客户端再次请求的时候,会在请求头的Cookie都会带上以上的信息,从而实现鉴权

1.5 Cookie存在的问题

问题:因为Cookie是保存在客户端的,cookie的数据可以在客户端被截获,对于一些机密的数据,比如用户名和密码,银行卡号,支付密码,身份证号码等,采用cookie来存储很不安全。

有人提出了新的技术,使用Cookie保存不重要的数据,使用session保存重要机密的数据。

2. Session

session是通过cookie来传值的

2.1 session鉴权原理

当客户端第一次登陆服务器的时候,服务器产生session,起名为sessionID(uid,windowsusers,phpid,phpwinid),一般是一个比较长的经过加密的字符串格式。该名称不是固定的,是有开发人员自定义的,在客户端和服务器分别保存一份。

然后再通过Cookie鉴权的方式实现session的鉴权

5-3.png

session的生命周期默认是30分钟。

2.2 session存在的问题

淘宝、京东等大型电子商务,用户量:十几万,几百万,几亿。存在服务器压力大的情况,使用负载均衡和服务器集群又会有sessionID复制的问题,而且session的生命周期有限制。采用单点登陆服务器统一管理可以避免赋值问题,但是单点登陆服务器压力过大。

5-4.png

一般在小型项目中才会出现session,而且近几年出现的公众号、小程序,app等,这些不需要依赖浏览器的项目,根本没有办法传递cookie

3. Token

3.1 Token鉴权原理

3.1.1 token获取方式

  1. 登录之后,自动生成token(经过加密的字符串)
  2. 通过一个特定的获取token的接口获取token,通过appid和secret

后面每一次请求都必须带上token实现鉴权

3.1.2 加密方法

  1. 对称加密:DES,AES
  2. 双钥加密:RSA,一般用于金融项目里面做签名
  3. 只加密不解密:MD5,SHA等
  4. 编码格式:base64

3.1.3 token的种类

  1. access_token: 时效15分钟到2小时之间
  2. refresh_token: 时效15天

4. 面试题

4.1. cookie、session、token的相同点和区别是什么?

相同点:都是用于身份验证(鉴权)的,都是服务器产生的

不同点:

  1. session是保存在客户端的,session是存储在服务器的 => session安全性高于cookie
  2. session是保存在服务器的内存中,默认时效为30分钟 => 服务器需要消耗资源去保存sessionid
  3. token是保存在服务器的数据库中的,是持久的