1. Cookie
诞生目的:解决HTTP通信无连接、无状态所带来的问题。
误解:Cookie是缓存?
1.1 什么是Cookie?
Cookie的本质是一小段的文本信息,是一种字符串格式的字典,key=value。cookie的名称不是固定的,是由开发者自定义的
1.2 Cookie的分类
- 会话Cookie:保存在内存,当浏览器的会话关闭之后会自动消失
- 持久Cookie:保存在硬盘,只有当失效时间到了才会消失
1.3 Cookie的形式
{name:值,value:值,Domain:域名(当前cookie作用于哪一个域名),Path:路径(当前cookie作用于哪一个域名下的某个路径),expries:失效时间(session表明是会话cookie)}
1.4 Cookie鉴权原理
- 客户端第一次请求服务器的时候,这个时候服务器如果产生了Cookie,会通过响应头中的set-Cookie把Cookie的信息传输到客户端
- 当客户端再次请求的时候,会在请求头的Cookie都会带上以上的信息,从而实现鉴权
1.5 Cookie存在的问题
问题:因为Cookie是保存在客户端的,cookie的数据可以在客户端被截获,对于一些机密的数据,比如用户名和密码,银行卡号,支付密码,身份证号码等,采用cookie来存储很不安全。
有人提出了新的技术,使用Cookie保存不重要的数据,使用session保存重要机密的数据。
2. Session
session是通过cookie来传值的
2.1 session鉴权原理
当客户端第一次登陆服务器的时候,服务器产生session,起名为sessionID(uid,windowsusers,phpid,phpwinid),一般是一个比较长的经过加密的字符串格式。该名称不是固定的,是有开发人员自定义的,在客户端和服务器分别保存一份。
然后再通过Cookie鉴权的方式实现session的鉴权
session的生命周期默认是30分钟。
2.2 session存在的问题
淘宝、京东等大型电子商务,用户量:十几万,几百万,几亿。存在服务器压力大的情况,使用负载均衡和服务器集群又会有sessionID复制的问题,而且session的生命周期有限制。采用单点登陆服务器统一管理可以避免赋值问题,但是单点登陆服务器压力过大。
一般在小型项目中才会出现session,而且近几年出现的公众号、小程序,app等,这些不需要依赖浏览器的项目,根本没有办法传递cookie
3. Token
3.1 Token鉴权原理
3.1.1 token获取方式
- 登录之后,自动生成token(经过加密的字符串)
- 通过一个特定的获取token的接口获取token,通过appid和secret
后面每一次请求都必须带上token实现鉴权
3.1.2 加密方法
- 对称加密:DES,AES
- 双钥加密:RSA,一般用于金融项目里面做签名
- 只加密不解密:MD5,SHA等
- 编码格式:base64
3.1.3 token的种类
- access_token: 时效15分钟到2小时之间
- refresh_token: 时效15天
4. 面试题
4.1. cookie、session、token的相同点和区别是什么?
相同点:都是用于身份验证(鉴权)的,都是服务器产生的
不同点:
- session是保存在客户端的,session是存储在服务器的 => session安全性高于cookie
- session是保存在服务器的内存中,默认时效为30分钟 => 服务器需要消耗资源去保存sessionid
- token是保存在服务器的数据库中的,是持久的