一、介绍
1、简介
这也是一个非常典型的 Web 会话认证方式,不是 OAuth,也不是 JWT,而是: 基于 Session + CSRF Token 的 Cookie 认证(Spring / Java 系生态最常见)
| 项目 | 是否 |
|---|---|
| Session-based Auth | ✅ |
| Cookie Auth | ✅ |
| CSRF Protection | ✅ |
| JWT | ❌ |
| OAuth2 | ❌ |
2、示例
XSRF-TOKEN=******; SESSION=******
二、组成
XSRF-TOKEN = e1a29ed4-8850-4e48-8ac5-833ccfad1899
SESSION = ljU0ZDa2OTMtMTg2gS00njE2LTk0MDEtOGUyMuYxNTE3MTZa
1、SESSION(核心认证凭证)
这是服务端 Session ID,登录成功后由服务器生成。
-
存在:内存 / Redis / DB
-
Cookie 里只存 sessionId
-
每次请求:
Cookie: SESSION=xxxx -
服务端用 sessionId 找用户信息,这就是真正的"你是谁"
2、XSRF-TOKEN(防 CSRF)
这是 CSRF 防护 token(不是身份认证),
-
用来防止:跨站请求伪造(CSRF)
-
常见于:Spring Security Angular / Vue
工作机制
-
服务端生成一个随机 token
-
放到 Cookie(
XSRF-TOKEN) -
前端每次 非 GET 请求时:
从 Cookie 读,然后放到 Header:
X-XSRF-TOKEN: e1a29ed4-8850-4e45-8ac5-833ccfad1896 -
服务端校验 Header 和 Cookie 是否一致
📌 它不代表登录态,只是"你是本站页面发的请求"
**三、**结合Playwright
// 登录后
BrowserContext context = browser.newContext();
// Cookie 会自动带
1、从 Cookie 里读 XSRF
String xsrf = context.cookies().stream()
.filter(c -> "XSRF-TOKEN".equals(c.name))
.findFirst()
.map(c -> c.value)
.orElse(null);
2、API 请求时带 Header
page.request().post("/api/xxx",
RequestOptions.create()
.setHeader("X-XSRF-TOKEN", xsrf)
);
3、复用登录态(自动化测试常用)
推荐做法:storageState
context.storageState(
new BrowserContext.StorageStateOptions()
.setPath(Paths.get("state.json"))
);
下次:
browser.newContext(
new Browser.NewContextOptions()
.setStorageStatePath(Paths.get("state.json"))
);