https://zh.wikipedia.org/wiki/Cookie

1 定义

image.png

1.1 服务端设置响应头set-cookie

image.png
比如:语雀登录页 响应头里就设置了三个cookie
image.png

1.1.1 服务端也可以通过set-cookie 来删除cookie

使用过期时间
image.png

1.2 客户端携带请求头cookies

image.png

比如从登录页跳转到首页,请求头部就会携带存在的cookies
image.png

2 cookie限制

3 cookie缺点

3.1 浏览器实现和代理转发限制

image.png

3.2 协议设计本身的问题

image.png

4 常见业务应用场景

4.1 登录鉴权-cookie+session

http本身是无状态的,使用cookie保存服务端维护的会话sessionID,就可以实现用户身份的识别,是最常见的一种登录鉴权方式。
登录鉴权
比如在石墨
登录接口成功时,响应头set-cookie:sessionID放到浏览器,以后每次请求都会携带
image.png
当在devtool中单独删除改cookie,重新刷新页面,就会跳到登录页
如果登出,一般会把对应的cookie保存时间设置的无效,这样就算用户退出了。

4.2 用户体验-记录用户偏好设置

最常见的网站国际化(I18n),当用户初始访问的时候,可能会返回英语或者根据ip返回对应语言,
当用户切换到法语fr时,就会把用户切换行为存在cookie中(1 可以前端js更改,直接修改cookie,并刷新页面, 2 也可以切换fr时,链接携带fr信息,后端更改cookie)
这样,当用户再次用该浏览器访问网站的时候,就可以根据浏览器保存的cookie值,优先返回对应语言,同时前端也需要跟进cookie,在用户交互过程中,展示对应语言包的文案。

再比如国际贸易的电商网站,切换货币,也是一个常见用户操作,

4.2.1 Amazon示例:

image.png
image.png

当然也可以有其他方式判断,比如
设置二级域名变(https://fr.xxxx.com/)
设置路径(https://developer.mozilla.org/fr/docs/Web/HTTP/Status/401
携带参数(https://www.yuque.com/?language=en-us

4.2.2 google-使用cookie

image.png
对Google Cookies的研究 - 技术知识库 - VMOVIER WIKI

4.3 广告联盟-第三方cookie

这个也是各大广告联盟(比如google/facebook/阿里/百度等大平台)常见的用法
参考:
比如:
google-使用cookie

image.png

4.4 数据分析

比如 gogole的

image.png
image.png

百度统计:

石墨文档就使用了百度统计,加载百度统计的js后,回向百度发送一系列用户浏览器信息(浏览器指纹)并植入cookie
image.png
image.png

百度统计-统计UV依据

某项目使用百度统计,统计后台可查看
image.png

9 工作遇到的cookie问题记录

9.1 httponly

登录注册改造项目上线分流后,测试发现流程跳转异常,在qa/灰度都没有遇到过

经排查,是因为线上某部署环境部分cookie策略设置成httponly,前端获取不到然后跳转异常,经运维修改后,流程正常
image.png

9.2 cookie包含特殊字符以及编解码

登录注册改造项目,后端设置的某些cookie值,带有两个冒号
image.png
然后后端处理不了,说必须编码

原因:How to create cookie without quotes around value?
Why do cookie values with whitespace arrive at the client side with quotes?
cookie有两个版本(v0和v1), v0 能被所有浏览器兼容,但是不能包含特殊字符,v1可以包含,但是兼容性不够
image.png

image.png

但是我在前端使用的decodeURL解码无效,使用decodeURIComponent才能解码出原来的字符串,
但是看前端主流cookie库,如$.cookie是用的都是decodeURL,所以先记录一下,后面具体研究下java端跟js端对应的编解码是否一致,以及原因

后来查到后端的编码方式是:

  1. CookieUtil.addCookie(name,Strings.escapeHtml(value), Consts.WEB_ROOT, 30 * 24 * 60 * 60, response)

但是网上查到的可以有对应前端编码方式的方法:
image.png

9.3 cookie的secure策略问题

如果cookie设置secure,则该cookie只会在https协议页面传递
还是上面同一个项目,注册成功后,303重定向模拟用户登录,改重定向location为https,响应头设置用户信息cookie,且设置secure,
然后再次重定向到输入手机页面,这个页面是http,在该页面前端获取上个https页面设置的cookie值,获取不到。
这个好像在官方文档没有具体说,是否可以被客户端读取,只说不可以在非https传递。

9.4 子域名 主域名 同名cookie共存 读取问题

image.png
有个接口需要从cookie读取语言站点,但是主域名和子域名可能存在同名cookie,导致读取cookie的值不一定