本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
本文主要是对Cookie和Session的纯理论介绍,后续会实现相关的案例。
什么是会话跟踪技术
1.什么是会话?
从浏览器发送第一个HTTP请求开始,到浏览器关闭,或服务器断开,就是一个会话。你可以理解为,浏览器和服务器的交互过程就是会话。浏览器是小美,服务器是大壮,他们两个聊天就是会话,小美或者大壮走了会话就结束。
2.为什么要会话跟踪技术?
浏览器和服务器交流主要是使用HTTP协议,而HTTP协议是无状态协议,每连接完成一次就会断开连接,所以HTTP请求都是独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次的发送者是不是同一个人。有点像小美和大壮每次聊天只有一来一回的对话,而且是匿名聊天,大壮不知道下一个和他聊天的是小美还是小红,那这样就没法连续聊天,所以下一次小美找大壮聊天的时候就要通过某种方式确认小美的身份。
3.有哪些会话跟踪技术?
有Cookie和Session两种技术:
- Cookie:客户端会话跟踪技术(小美有个聊天证,每次聊天递给大壮这个证,确认是小美)
- Session:服务器会话跟踪技术(大壮在小美的聊天证上写一个专属标识,会话结束以后消失,大壮看到就知道是小美)
会话跟踪技术之Cookie
1.什么是Cookie?
Cookie是浏览器在访问服务器的时候,服务器返回给浏览器并且保存在本地的一段数据,这段数据会在浏览器下一次给服务器发送信息的时候一并发送过去,这样就可以作为身份的标识。
2.Cookie的认证流程
- 当浏览器第一次向服务器发送请求的时候,服务器接收到请求并返回响应,并且给客户端一个
Set-Cookie - 浏览器将
Cookie保存到本地 - 之后浏览器向服务器发送请求时,同时将Cookie发送到服务端
3.Cookie的属性
我们可以在开发者工具中看到,这里的几个都是Cookie重要的属性
| 属性名 | 说明 |
|---|---|
| name(名称)和value(值) | 键值对,设置 Cookie 的名称及相对应的值,都必须是字符串类型。 |
| domain | 指定 cookie 所属域名,默认是当前域名 |
| path | 指定 cookie 在哪个路径(路由)下生效,默认是 '/'。 |
| maxAge/expires | 指定cookie的生命周期,一般使用maxAge |
| httpOnly | 如果给某个 cookie 设置了 httpOnly 属性,则无法通过 JS 脚本 读取到该 cookie 的信息,但还是能通过 Application 中手动修改 cookie,所以只是在一定程度上可以防止 XSS 攻击,不是绝对的安全 |
| secure | 当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效。 |
4.Cookie细节
-
Cookie不可跨域:每个 cookie 都会绑定单一的域名,无法在别的域名下获取使用,当你访问baidu.com的时候不会将google.com的Cookie发送过去,但是一级域名和二级域名允许使用
domain共享的 -
Cookie对name和value的保存方法:
- 如果值为 Unicode 字符,需要为字符编码(比如中文)。
- 如果值为二进制数据,则需要使用 BASE64 编码。
-
Cookie的有效期:有效期和其他外界因素无关,只和
MaxAge的值有关MaxAge > 0:无关浏览器、服务器是否关闭,只要时间在MaxAge之前就还有效MaxAge = 0:浏览器关闭就失效MaxAge < 0:表示删除这个Cookie
会话跟踪技术之Session
1.什么是Session
Session是一种基于Cookie的会话跟踪技术,Session是存储在服务端的,SessionId会存储在客户端的Cookie上。
2.Session的认证流程
- 浏览器向服务器发送请求,服务器根据浏览器提交的信息,创建Session
- 服务器响应,同时将SessionId返回给浏览器
- 浏览器将SessionId存入Cookie,同时要记录SessionId的域名
- 当浏览第二次给服务器发送请求的时候,请求会自动判断此域名下是否存在 Cookie 信息,如果存在自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID,再根据 SessionID 查找对应的 Session 信息,再执行后续操作。
3.Session的生命周期
和Cookie不同,Session的生命周期是由几个方面决定:
- 浏览器一旦关闭,Session就会失效
- 设置Session超时,一旦超时Session也会失效,可以在wen.xml中设置
4.Cookie和Session的区别
- 存储的值:Cookie只能存储字符串,但是Session可以存储对象
- 安全性:Session比Cookie更加安全
- 生命周期:Cookie只取决于
MaxAge,而Session则取决于浏览器,是否超时等因素 - 存储大小: 单个 Cookie 保存的数据不能超过 4K,Session 可存储数据远高于 Cookie,但是当访问量过多,会占用过多的服务器资源。