面试相关Cookie、Session和Token
Cookie、Session和Token
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session
作用:由于 HTTP 协议是无状态的,服务器无法从连接上跟踪会话,这严重阻碍了交互式Web应用程序的实现。
Cookie
概述
是服务器发送到用户浏览器并保存在本地客户端的一小块数据,下一次请求同一网站时会把该cookie发送给服务器
应用场景
Cookie的根本作用就是在客户端存储用户访问网站的一些信息。
- 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
- 个性化设置(如用户自定义设置、主题等)
- 浏览器行为跟踪(如跟踪分析用户行为等)
缺陷
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
- Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
跨域性
举例:域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去
Cookie的不可跨域名性,由Cookie的隐私安全机制决定
Session
概述
Session 字面意思就是会话。其中 Session 对象存储特定用户所需的数据,是服务器端使用的一种记录客户端状态的机制
应用场景
除非是纯静态的页面,否则都会用到session来记录用户的行为。(只访问HTML、IMAGE等静态资源并不会创建Session)
缺陷
- 存放在服务器中,会对服务器造成压力
- 如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。
- 不可扩展
- 不可跨域
Cookie 和 Session的关联
使用cookie和session的根本原因:HTTP 协议是无状态的,服务器无法从连接上跟踪会话
这个时候就需要有一个机制来告诉服务端,本次操作用户是否登录,是哪个用户在执行的操作,那这套机制的实现就需要 Cookie 和 Session 的配合。连接两者的桥梁 —— SessionID
用户登录原理
用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的 Session ,请求返回时将此 Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入到 Cookie 中,同时 Cookie 记录此 SessionID 属于哪个域名。
当用户第二次访问服务器的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,如果没有找到说明用户没有登录或者登录失效,如果找到 Session 证明用户已经登录可执行后面操作。
Cookie和Session的区别
Cookie | Session | |
---|---|---|
作用范围 | 保存在客户端 | 保存在服务器 |
安全性 | 保存在客户端,容易被窃取,安全性低 | 保存在服务端,安全性高 |
存取方式 | 只能保存ASCII | 可以保存任意类型数据 |
有效期 | 可设置长时间保存(如:默认登录) | 保存时间短,关闭客户端或超时都会失效 |
可存储大小 | 单个cookie数据不超过4K,不占服务器资源 | 存储数据大,占服务器资源 |
浏览器中禁止了Cookie,怎么解决
URL重写,把 SessionID 附加到url上
- 缺点:整个站点中不能有纯静态页面,因为纯静态页面SessionID 将无法继续传到下一页面
Token 机制
概述
Token 机制(令牌):在服务端生成的一串字符串,作为客户端进行请求的一个标识
特性
- 无状态、可扩展
- 支持移动设备
- 跨程序调用
- 安全
基于服务器验证方式暴露的一些问题
- Seesion:请求过多时内存的开销增加。(Token无状态性)
- 可扩展性:在服务端的内存中使用Seesion存储登录信息,伴随而来的是可扩展性问题。(可拓展性)
- CORS(跨域资源共享):当我们需要让数据跨多台移动设备上使用时,跨域资源的共享会是一个让人头疼的问题。在使用Ajax抓取另一个域的资源,就可以会出现禁止请求的情况。
- CSRF(跨站请求伪造):用户在访问银行网站时,他们很容易受到跨站请求伪造的攻击,并且能够被利用其访问其他的网站。
基于Token的身份验证是无状态的,不需要将用户信息存放在服务器或Session中
基于Token的身份验证的过程
-
当客户端第一次请求时,发送用户信息至服务器(用户名、密码),服务器对用户信息使用HS256算法及**进行签名,再将这个签名和数据一起作为Token一起返回给客户端
-
服务器不保存Token,客户端保存Token(比如放在 Cookie 里或者 Local Storage 里)
-
当客户端再次发送请求时,在请求信息中将Token一起发给服务器
-
服务器用同样的HS256算法和同样的**,对数据再进行一次签名,和客户端返回的Token的签名进行比较,如果验证成功,就向客户端返回请求的数据
三者区别
token和session其实都是为了身份验证,session翻译为会话,而token翻译为令牌
Session | Token | |
---|---|---|
存储位置 | 服务器(压力大) | 保在 Cookie 或 Local Storage 里(对服务器没有额外的压力) |
可拓展性 | 不可拓展 | 拓展性强 |
跨域 | 不支持跨域 | 支持跨域 |
Cookie与Token的区别
Tooken采用对称加密,安全性比Cookie高
参考