cookie和session、favicon.ico
Cookie
工作原理
1.当用户第一次访问服务器时,服务器会在响应的 HTTP 头中设置 Set-Cookie 选项,用于设置 Cookie 到用户的浏览器上,cookie的本质就是数据,其保存方式有两种,一种是保存在内存中,那这就是会话cookie,客户端进程退出那么cookie就没了,还有一种是保存在文件中,那就是持久cookie,这样的话浏览器进程退出,该cookie也不会消失,当然这也不是永久的,而是定时就失效了。
分类
cookie的设置
完整的 Set-Cookie 示例
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00
UTC; path=/; domain=.example.com; secure; HttpOnly
RFC 1123 互联网时间格式标准
示例:
Tue, 16 Jul 2024 08:30:45 GMT
格式详解
星期几:3字母英文缩写(Mon, Tue, Wed等)
日期:2位数字(前导零可选)
月份:3字母英文缩写(Jan, Feb, Mar等)
年份:4位数字
时间:24小时制,HH:MM:SS
时间标准:GMT (格林尼治标准时间)或UTC (协调世界时)
set-cookie可选属性介绍
1.username指明用户,expires是cookie的失效时间,path和domain是做一个限制,只有http请求是发送给这个路径、发送给这个域名,那才会在http请求报头的选项中加上cookie,set-cookie设置了secure字段,那么只有https请求,才能加上cookie,http就不行了,set-cookie设置httponly,那客户端脚本就不能访问cookie
Session
session 的本质是保存在服务器端的数据
工作原理
在cookie的技术体系中,数据保存客户端内存或文件中,这并不安全,因此又引入了session的技术体系,将会话数据存储在服务器端内存、数据库或缓存中,只给客户端一个session id来找到对应数据
安全性
超时和失效
Cookie和Session的合作用途
会话信息保存在服务器端的内存或文件中,然后将session id加进http响应头的set-cookie中,接着客户端收到http响应,将cookie保存在客户端内存或文件中,然后之后每次请求如果符合限制条件(路径、域名)都会带上cookie,也就是那个session id,然后就可以实现用户认证和会话管理和安全性于一体
Cookie 和 Session 的协作流程
会话初始化(用户首次访问):
服务器检测到请求中没有 Session ID(如
Cookie: sessionid=xxx
不存在)。服务器生成唯一 Session ID(如
abc123xyz
),通常是一个高强度随机字符串(避免可预测性)。服务器存储会话数据:
在内存(如 Redis)、数据库或文件中保存会话数据(如
{ "sessionid": "abc123xyz", "user_id": 123, "last_activity": 1620000000 }
)。会话数据中可能包含用户身份、权限、临时状态等信息。
响应阶段(Set-Cookie):
HTTP/1.1 200 OK Set-Cookie: sessionid=abc123xyz; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=3600
关键属性说明:
HttpOnly
:防止 JavaScript 通过document.cookie
访问(防 XSS)。Secure
:仅通过 HTTPS 传输(防明文泄露)。SameSite=Lax/Strict
:控制跨站请求时是否发送 Cookie(防 CSRF)。Max-Age/Expires
:设置有效期(会话过期时间)。
客户端存储 Cookie:
浏览器收到
Set-Cookie
后,按规则存储 Cookie(包括域名、路径、有效期等)。存储位置可能为内存(会话 Cookie)或磁盘(持久化 Cookie)。
后续请求:
浏览器自动在符合条件的请求头中添加 Cookie:
GET /profile HTTP/1.1 Cookie: sessionid=abc123xyz
条件限制:仅当请求的域名、路径匹配 Cookie 属性时才会发送。
服务器验证会话:
服务器读取
Cookie: sessionid=abc123xyz
,查询内存/数据库中的会话数据。验证 Session ID 是否有效、是否过期、是否被篡改(如签名机制)。
通过后,认为请求已认证,返回用户专属数据。
favicon.ico
1.favicon.ico 是一个网站图标文件,通常显示在浏览器的标签页上、地址栏旁边和收藏夹中。这个文件名 favicon 是 "favorite icon" 的缩写,而 .ico 是图标文件的后缀
2.通常浏览器会为了获取图标而专门构建 http 的GET请求,路径就是/favicon.ico