
1、共享用户身份凭证(Session/Token)
2、集中管理登录状态与过期机制
3、保证安全性与一致性Domain=.example.com → 允许子域共享;Path=/ → 全路径有效;HttpOnly=true → 防止 JS 读取;Secure=true → 仅在 HTTPS 传输;SameSite=None → 跨子域请求时必须。示例(Spring Boot):
ResponseCookie cookie = ResponseCookie.from("SESSIONID", sessionId)
.domain(".example.com")
.path("/")
.httpOnly(true)
.secure(true)
.sameSite("None")
.maxAge(Duration.ofHours(2))
.build();
response.setHeader(HttpHeaders.SET_COOKIE, cookie.toString());key: session:abc123
val: { userId: 1001, roles: [...], expiresAt: 173.. }后端提供登出接口:
跨域时 Cookie 无法共享,需通过 统一认证中心(SSO) 管理登录态。认证中心保存用户主会话,并在各前端域请求登录时发放临时 Token(如 OAuth2 的授权码),由各前端后端交换 Token 并建立本域的会话。
OAuth2 + OpenID Connect (OIDC);appA.com → 未登录 → 重定向至 auth.example.com;code;appA.com 后端通过 code 换取 Token;appA.com 设置本域 HttpOnly Cookie;appB.net 时,Auth Server 检测已有主 Session,直接签发 Token(无感登录)。核心代码(Java 伪示例):
String code = request.getParameter("code");
TokenResponse token = oauthClient.exchangeCodeForToken(code);
String sessionId = createLocalSession(token);
setCookie(response, "SESSIONID", sessionId, domain = "appB.net");appA.com 生成短期 Token 并跳转:https://appB.net/accept?token=eyJhbGciOi...appB.net 校验 Token → 生成本地 Session → 重定向去除参数。伪代码:
app.get('/accept', async (req, res) => {
const token = req.query.token;
const payload = verifyOneTimeToken(token);
if (!payload) return res.status(401).send('invalid');
const sessionId = await createLocalSession(payload.userId);
res.cookie('SESSIONID', sessionId, { httpOnly: true, secure: true });
res.redirect('/');
});场景 | 推荐方案 | 特点 |
|---|---|---|
同主域名 | Cookie + 集中式 Session(Redis) | 简单高效,稳定可靠 |
跨主域 | SSO(OAuth2/OIDC) | 标准方案,无感体验 |
临时跨域 | URL Token | 短期可用,风险高 |
Cookie + Redis Session 共享,简单高效;SSO 统一认证中心(OAuth2/OIDC),支持扩展与审计;URL Token,但需严格时效与安全控制。原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。