2

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:

  1. 浏览器端可以用js的 document.cookie="key=value"; 来设置
  2. 服务器端可以使用对应语言的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...

新数学习小组
13 声望3 粉丝

新数学习小组: