很多初学者知道 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 混为一谈。

更多推荐