cookie
1. 是什么?
服务器保存在浏览器的一小段文本信息,≤4kB
不同浏览器或不同网站cookie都不同,相同网站不同浏览器的cookie键相同,值不同,键值顺序不同
问:SRCHD=AF=NOFORM;
这个cookie的键值对是什么
答:字符串中第一个 = 作为键值对的分隔符,所以该cookie的健为SRCHD,值为 AF=NOFORM,如下图:
2. 功能?
HTTP无状态
服务器用来分辨两个请求是否来自同一浏览器,保存一些状态信息
对话管理:登录、购物车等对话管理
个性化:网页字体大小、背景色等用户偏好
追踪:记录和分析用户行为
3. 如何设置?
每个cookie键值对都可以设置Expires、Max-Age、Path、Domain、Secure、HttpOnly等属性
Expire、Max-Age(秒):同时存在Max-Age优先级更高,都没有设置就是session cookie
Domain、Path:域名、HTTP请求路径/...
Secure:只应通过HTTPS协议加密过的请求发送给服务器(不保证绝对安全),http协议自动关,https协议自动开
HttpOnly:无法通过document.cookie访问,只能发送给服务端
Cookie创建:
浏览器端和服务端都可以创建cookie:
- 浏览器端可以用js的
document.cookie="key=value";
来设置 - 服务器端可以使用对应语言的cookie操作函数(如php的
setcookie
),然后在服务端返回给客户端的HTTP Response头部会带上Set-Cookie
,浏览器拿到这个cookie后会在以后的请求头中带上这个cookie,下面是一个服务器端返回头里的Set-Cookie
例子:
Set-Cookie: id=a3fWa; expires=Wed, 21 Oct 2015 07:28:00 GMT;secure; httpOnly=true; domain=bing.com; path=/;
流程:浏览器首次访问服务器 >>> 服务器在响应头中写入cookie,返回给浏览器 >>> 浏览器携带cookie再次访问服务器 >>> 服务器根据cookie判断请求来自同一浏览器
Cookie更改:
重新调用各端的cookie设置函数复写原来的key即可,这里需要注意,修改时需要name、domain、path、secure属性和原来的属性完全匹配才会修改原来的那一条值,否则会生成一条同名的新cookie
Cookie删除:
重新调用各端的cookie设置函数,将要删除的cookie的expire属性设置为一个过期的时间即可(目前在浏览器控制台,对服务器下发cookie的修改、删除等设置都无效)
4. 安全问题?
客户端修改cookie,怎么办?
可以设置 HttpOnly
属性,来阻止浏览器端通过 document.cookie
访问和操作某个cookie
给cookie加哈希值签名:
签名前:SID=s%3Aefg
签名后:SID=s%3Aefg.7FJDuO2E9LMyby6%2Bo1fGQ3wkIHGB9v1CDVWod8NQVAo(nodejs示例)
(node.js使用cookieParser中间件签名、解签)
session
1. 是什么?
会话控制,session对象存储特定用户会话所需的信息
2. 功能?
将重要的会话信息保存在服务器端,比直接使用cookie保存在客户端更安全
3. 使用流程?
浏览器首次访问服务器 >>> 服务器生成唯一标识符sessionID和存储会话信息的session对象,sessionID放在返回请求头中的 Set-Coookie
中,返回给浏览器 >>> 浏览器携带包含sessionID的cookie再次访问服务器 >>> 服务器取cookie中的sessionID继续后续处理
4. 存哪里?
优点 | 缺点 | |
---|---|---|
内存 | 获取速度快 | 并发请求多时,服务器内存占用较大,容易造成内存溢出;分布式环境无法实现session共享;停电等服务器暂停服务后重启,session丢失不可恢复 |
文件 | 服务器暂停服务后重启,有效期内的session仍然可用 | 获取速度慢;分布式环境,需复制session文件至多台服务器 |
redis | 获取速度快;分布式共享;有效期内可找回 |
cookie vs session
cookie | session | |
---|---|---|
存储位置 | 客户端 | 服务器 |
存储内容 | ASCII字符串 | 任何类型的数据 |
有效期 | 可实现长期有效 | 一般为会话期间有效,不宜过长 |
安全 | 客户端透明 | 客户端不透明 |
服务器压力 | zero | 并发用户多时,耗费大量内存/redis |
浏览器支持 | 禁用cookie,追踪无效 | 禁用cookie,可采用url重写 |
其他文献:
PHP中的session: https://www.dragonballsoft.cn...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。