⌨️ 第六章 Web技术与安全
📄 本篇一句话

HTTP 天生健忘(无状态),Cookie 和会话是给它装的记性——Cookie 把小纸条存在你浏览器里,会话把底账存在服务器里,两边用同一个 SessionID 对上号。

📝 在本章的位置

上游:网络 4.7 · Cookie 已讲过报文细节;本篇补全「Cookie+会话」这对搭档与安全边界。下游:6-5 的动态网站靠它区分用户,6-19 的 XSS/CSRF 攻击主要就打这里。

一、为什么需要记性

HTTP 每个请求都是独立的——服务器处理完就忘。可现实需求全靠记性:登录状态、购物车、阅读进度。解法两步: 1. 第一次见面发凭证:服务器在响应里塞一句 Set-Cookie: sessionid=abc123,浏览器存下来。 2. 之后每次自报家门:浏览器对该站点的每个请求自动带上 Cookie: sessionid=abc123。

# Python 标准库视角:Set-Cookie 长什么样
from http.cookies import SimpleCookie
c = SimpleCookie()
c["sessionid"] = "abc123"
c["sessionid"]["max-age"] = 3600        # 1 小时后过期
c["sessionid"]["httponly"] = True       # 禁止 JS 读取(防 6-19 的 XSS 偷凭证)
print(c.output())
# Set-Cookie: sessionid=abc123; Max-Age=3600; HttpOnly

二、Cookie:浏览器里的小纸条

三、会话(Session):服务器里的底账

敏感数据(用户名、权限、购物车)不进 Cookie,存服务器的会话存储里;Cookie 里只放一把钥匙 SessionID:

浏览器 Cookie: sessionid=abc123   →  服务器会话表:
                                    abc123 → {user: 波仔, cart: [键盘×2]}

Cookie 与 Token(JWT):教材时代主流是「服务器存底账」的 Session;如今前后端分离流行把凭证本身(签名过的 Token)发给客户端保存——服务器不用存底账,但无法单方面作废。两条路线至今并存。

动手 Demo:自己当一次服务器,发 Cookie

# 用 Python 内置 HTTP 服务器发 Cookie(保存为 demo_cookie.py 运行)
from http.server import BaseHTTPRequestHandler, HTTPServer

class H(BaseHTTPRequestHandler):
    def do_GET(self):
        if "sessionid=" in self.headers.get("Cookie", ""):
            body = "欢迎回来,老朋友!".encode()
            self.send_response(200)
            self.end_headers()
        else:
            body = "第一次来?送你一张 Cookie。".encode()
            self.send_response(200)
            self.send_header("Set-Cookie", "sessionid=xyz789; HttpOnly")
            self.end_headers()
        self.wfile.write(body)

HTTPServer(("127.0.0.1", 8000), H).serve_forever()

看到什么算成功:浏览器开 http://127.0.0.1:8000 显示「第一次来?」,刷新后变成「欢迎回来,老朋友!」——F12 → 应用(Application)→ Cookie 里能看到 sessionid=xyz789。

读结果:第二次请求浏览器自动带上了 Cookie,服务器据此认出了你——整套登录机制的最小原型就这十行。

30 秒实验

F12 → 应用(Application)→ Cookie → 选任意网站看一眼;再在控制台跑 document.cookie——若返回空,说明该站 Cookie 设了 HttpOnly(JS 读不到,防偷)。数一数自己常逛的网站给你埋了多少条小纸条。

常见误区

自测三问(点击展开) 1. **HTTP 无状态是什么意思?** 答:每个请求独立处理,服务器不记得请求之间的关联。 2. **Cookie 和 Session 各存什么、在哪存?** 答:Cookie 存 SessionID(浏览器);Session 存用户状态底账(服务器);两边靠 SessionID 对号。 3. **SessionID 被偷会怎样?怎么防?** 答:被偷=被冒充;防法=足够随机+HTTPS+HttpOnly+及时过期。

相关笔记