1.Cookie
1.1 概念
由于HTTP是无状态,无连接的,由于为了让用户的使用简便一些,于是诞生了cookie 与 session
HTTP Cookie(也称为Web Cookie、浏览器Cookie或简称Cookie)是服务器发送到⽤⼾浏览器并保存在浏览器上(一般是文件级) 的⼀⼩块数据,它会在浏览器之后向同⼀服务器再次发起请求时被携带并发送到服务器上。通常,它⽤于告知服务端两个请求是否来⾃同⼀浏览器,如保持⽤⼾的登录状态、记录⽤⼾偏好等。
1.2 ⼯作原理
当⽤⼾第⼀次访问⽹站时,服务器会在响应的HTTP头中设置 Set-Cookie 字段,⽤于发送
Cookie到⽤⼾的浏览器。
浏览器在接收到Cookie后,会将其保存在本地(通常是按照域名进⾏存储)。
在之后的请求中,浏览器会⾃动在 HTTP 请求头中携带 Cookie 字段,将之前保存的Cookie
信息发送给服务器。
会话 Cookie(Session Cookie) :在浏览器关闭时失效。
持久 Cookie(Persistent Cookie) :带有明确的过期⽇期或持续时间,可以跨多个浏
览器会话存在。
如果 cookie 是⼀个持久性的 cookie ,那么它其实就是浏览器相关的,特定⽬录下的⼀个⽂件。但直接查看这些⽂件可能会看到乱码或⽆法读取的内容,因为 cookie ⽂件通常以⼆进制或 sqlite 格式存储。⼀般查看,直接在浏览器对应的选项中直接查看即可。
1.3 用途
⽤⼾认证和会话管理(最重要)
跟踪⽤⼾⾏为
缓存⽤⼾偏好等
⽐如在chrome浏览器下,可以直接访问:chrome://settings/cookies
1.4 cookie的基本格式
HTTP 存在⼀个报头选项: Set-Cookie , 可以⽤来进⾏给浏览器设置 Cookie 值。
在 HTTP 响应头中添加,客⼾端(如浏览器)获取并⾃⾏设置并保存 Cookie 。
Set-Cookie: <name>=<value>
其中 <name> 是 Cookie 的名称,<value> 是 Cookie 的值。
完整示例
Set-Cookie: username=peter; expires=Thu, 18 Dec 2024 12:00:00 UTC; path=/;
domain=.example.com; secure; HttpOnly
一步一步来看
首先username=peter,username是 Cookie 的名称,peter是 Cookie 的值,代表账户名和密码
expires=Thu, 18 Dec 2024 12:00:00 UTC,这代表设置 Cookie 的过期⽇期/时间。
如果设置了 expires 属性,则 Cookie 将在指定的⽇期/时间后过期。
如果没有设置 expires 属性,则 Cookie 默认为会话 Cookie,即当浏览器关闭时过期
时间格式必须遵守RFC 1123标准,具体格式样例: Tue, 01 Jan 2030 12:34:56 GMT或者UTC(推荐)
Tue: 星期⼆(星期⼏的缩写)
,: 逗号分隔符
01: ⽇期(两位数表⽰)
Jan: ⼀⽉(⽉份的缩写)
2030: 年份(四位数)
12:34:56: 时间(⼩时、分钟、秒)
GMT: 格林威治标准时间(时区缩写)
path=/;限制 Cookie 发送到服务器的哪些路径。默认为设置它的路径,利用这个就可以区分那些用户可以访问,那些用户不能访问(VIP和非VIP用户)
下面三个了解即可
domain=.example.com指定哪些主机可以接受该 Cookie。默认为设置它的主机。
secure 仅当使⽤ HTTPS 协议时才发送 Cookie。这有助于防⽌ Cookie 在不安全的 HTTP 连接中被截获。
HttpOnly标记 Cookie 为 HttpOnly,意味着该 Cookie 不能被客⼾端脚本(如JavaScript)访问。这有助于防⽌跨站脚本攻击(XSS)
注意:
每个 Cookie 属性都以分号( ; )和空格( )分隔。
名称和值之间使⽤等号( = )分隔。
如果 Cookie 的名称或值包含特殊字符(如空格、分号、逗号等),则需要进⾏ URL 编码
1.5 安全性问题
由于 Cookie 是存储在客⼾端的,因此存在被篡改或窃取的⻛险,此时就需要Session
2. Session
2.1 概念
HTTP Session是服务器⽤来跟踪⽤⼾与服务器交互期间⽤⼾状态的机制。由于HTTP协议是⽆状态的(每个请求都是独⽴的),因此服务器需要通过Session来记住⽤⼾的信息。
2.2 ⼯作原理
当⽤⼾⾸次访问⽹站时,服务器会为⽤⼾创建⼀个唯⼀的 Session ID ,并通过 Cookie 将其
发送到客⼾端。
客⼾端在之后的请求中会携带这个 Session ID ,服务器通过 Session ID 来识别⽤⼾,从⽽
获取⽤⼾的会话信息。
服务器通常会将 Session 信息存储在内存、数据库或缓存中。
Session同样在服务器中需要管理起来,对此使用一个类就可以
2.3 ⽤途
⽤⼾认证和会话管理
存储⽤⼾的临时数据(如购物⻋内容)
实现分布式系统的会话共享(通过将会话数据存储在共享数据库或缓存中)
2.4 安全性问题
与 Cookie 相似,由于 Session ID 是在客⼾端和服务器之间传递的,因此也存在被窃取的⻛
险。
但是⼀般虽然 Cookie 被盗取了,但是⽤⼾只泄漏了⼀个 Session ID ,私密信息暂时没有被
泄露的⻛险
Session ID便于服务端进⾏客⼾端有效性的管理,⽐如异地登录。
可以通过 HTTPS 和设置合适的 Cookie 属性(如 HttpOnly 和 Secure )来增强安全性。
3.总结
HTTP Cookie和Session都是⽤于在Web应⽤中跟踪⽤⼾状态的机制。Cookie是存储在客⼾端的,⽽Session是存储在服务器端的。它们各有优缺点,通常在实际应⽤中会结合使⽤,以达到最佳的⽤⼾体验和安全性。
