Python 后端基础(三):HTTPS、Cookie、Session、CORS 一篇讲清
很多初学者知道 HTTP,但一遇到 HTTPS、Cookie、Session、CORS 就开始混。本文用登录场景讲清这些概念分别解决什么问题、为什么会出现、后端项目里怎么配置。
【一、HTTPS 是什么】
HTTPS 可以简单理解为:
HTTPS = HTTP + TLS/SSL 加密
HTTP 本身是明文传输。也就是说,如果你在 HTTP 网站提交账号密码,中间网络节点理论上可能看到你的请求内容。
HTTPS 在 HTTP 外面加了一层加密保护,主要解决三个问题:
1. 加密:别人抓到数据也看不懂。
2. 身份验证:确认你访问的确实是目标网站,不是假网站。
3. 完整性:防止传输过程中数据被篡改。
所以登录、支付、后台管理、AI API Key 传输都必须使用 HTTPS。
【二、Cookie 是什么】
Cookie 是浏览器保存的一小段数据,会在符合条件时自动带给服务器。
例如服务器返回:
Set-Cookie: session_id=abc123; HttpOnly; Path=/; Max-Age=3600
浏览器会保存这个 Cookie。之后访问同一个网站时,浏览器会自动带上:
Cookie: session_id=abc123
Cookie 常用于保存登录态、追踪用户会话、记录偏好设置。
【三、Session 是什么】
Session 是服务端保存的会话数据。
传统登录流程是:
用户提交账号密码
-> 后端校验成功
-> 后端创建 session 数据,保存到服务端
-> 后端把 session_id 放到 Cookie 返回给浏览器
-> 浏览器之后每次请求自动带 session_id
-> 后端根据 session_id 找到当前用户
所以 Cookie 和 Session 的关系是:
- Cookie 在浏览器端,负责保存 `session_id`。
- Session 在服务端,负责保存真实登录信息。
Cookie 像取件码,Session 像快递柜里的真实包裹。
【四、Cookie 常见安全属性】
后端设置 Cookie 时,经常会加这些属性:
Set-Cookie: session_id=abc123; HttpOnly; Secure; SameSite=Lax
含义:
- `HttpOnly`:禁止 JavaScript 读取 Cookie,降低 XSS 窃取风险。
- `Secure`:只允许 HTTPS 传输。
- `SameSite`:限制跨站请求携带 Cookie,降低 CSRF 风险。
- `Max-Age` / `Expires`:控制过期时间。
如果做登录系统,这些属性非常重要。
【五、JWT 和 Session 有什么区别】
Session 登录是服务端保存登录状态;JWT 登录是服务端签发 Token,客户端保存 Token。
Session:
服务端保存 session -> 客户端保存 session_id
JWT:
服务端签发 token -> 客户端保存 token -> 每次请求带 token
JWT 的优点是适合前后端分离、移动端、微服务;缺点是 token 一旦签发,在过期前不太容易主动失效,除非引入黑名单或版本号机制。
【六、CORS 是什么】
CORS 是浏览器的跨域安全机制。
注意一句话:CORS 主要是浏览器限制,不是后端、Postman、curl 的限制。
什么是跨域?只要协议、域名、端口有一个不同,就算跨域。
http://localhost:3000 -> http://localhost:8000 跨域,端口不同
http://a.com -> http://b.com 跨域,域名不同
http://a.com -> https://a.com 跨域,协议不同
前端开发时最常见:
前端:localhost:3000
后端:localhost:8000
浏览器发现前端页面和后端接口不是同一个源,就会检查后端是否允许跨域。
【七、CORS 放行到底放行什么】
后端需要通过响应头告诉浏览器:哪些来源可以访问我。
常见响应头:
Access-Control-Allow-Origin: http://localhost:3000
Access-Control-Allow-Methods: GET,POST,PUT,DELETE
Access-Control-Allow-Headers: Authorization,Content-Type
Access-Control-Allow-Credentials: true
意思是:
- 允许 `http://localhost:3000` 调用接口。
- 允许这些 HTTP 方法。
- 允许携带 `Authorization`、`Content-Type` 这些请求头。
- 是否允许带 Cookie 等凭证。
【八、FastAPI 配置 CORS】
python
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
开发环境可以适当放宽,生产环境不要随便写 `allow_origins=["*"]`,尤其是涉及 Cookie 和登录态时。
【九、预检请求 OPTIONS 是什么】
当前端发送一些“非简单请求”时,浏览器会先发一个 OPTIONS 请求,问后端:
我准备发一个 POST 请求,还要带 Authorization 请求头,你允许吗?
如果后端返回允许,浏览器才会继续发送真正请求。
所以你有时会在后端日志里看到 OPTIONS,这不是重复请求,而是浏览器的安全检查。
【十、常见坑】
- Postman 能调通,浏览器调不通:大概率是 CORS。
- 允许跨域但忘了允许 `Authorization` 请求头,导致 JWT 请求失败。
- 前端带 Cookie,但后端没有设置 `allow_credentials=True`。
- 生产环境 CORS 直接放 `*`,存在安全风险。
- 把 Cookie、Session、JWT 混为一谈。
更多推荐
所有评论(0)