KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
术语工作定义(本课程口径) — keel 龙骨
SSO 工程课:协议、令牌与会话 的参考信息:术语工作定义(本课程口径)
只写本课判断要用到的那一层定义,以及经常被搞混的那一侧。
完整的来历、形态与衍生概念在《SSO 概念课》对应页。
| 术语 | 本课口径 | 常见误用 |
|---|---|---|
| 认证 / Authentication | 回答「你是谁」。产物是一个身份结论(sub + 一组 claim)。 |
与授权混为一谈,导致「登录成功」被当成「有权限」 |
| 授权 / Authorization | 回答「你能做什么」。属于《权限与多租户》。 | 指望 SSO 顺带解决权限 |
| IdP / OP(Identity Provider / OpenID Provider) | 签发身份结论的一侧。本课主案例里是 realm sso-lab。 |
以为 IdP 也管应用里的权限 |
| SP / RP(Service Provider / Relying Party) | 接受身份结论的一侧,即「应用」。 | 把 RP 当成 IdP 的下属组件——它是独立系统,只按协议合作 |
| realm | IdP 内的一组隔离配置:用户、客户端、密钥、会话各自独立。 | 把 realm 当成「一个应用」;实际是一个信任域 |
client / client_id |
在 IdP 登记过的一个应用的身份。回跳地址、客户端类型都挂在它名下。 | 把 client_id 当密钥——公开客户端的 client_id 是公开的 |
| 公开客户端 / 机密客户端 | 拿不住秘密的是公开客户端(浏览器、移动端),只能靠 PKCE;有可信后端的可以持有 client_secret。 |
给公开客户端配 client_secret,等于把秘密发到前端 |
授权码 / code |
一次性凭据,只表示「这次授权发生过」。它本身换不出任何东西。 | 把 code 当成 token 或登录凭证 |
PKCE / code_verifier / code_challenge |
应用自己生成 verifier,把它的摘要作为 challenge 先送去;换 token 时再出示原文。 |
以为 PKCE 用来加密 code——它防的是 code 被截获后被别人兑换 |
state |
应用生成的不可预测值,原样往返,用来把回跳与本次请求对上(防 CSRF/重放)。 | 用固定值或可预测值,等于没有 |
nonce |
应用生成的不可预测值,被写进 ID Token,用来把「这次登录」与「这次 ID Token」绑上。 | 与 state 混用;两者防的不是同一件事 |
iss(issuer) |
签发者的字面量标识。回跳里出现的是 RFC 9207 的授权响应发行者标识,用于 Mix-Up 防护。 | 以为「地址看起来一样」就相等——http/https、端口、末尾斜杠都算差异 |
| ID Token | 一次认证的结论,aud 是 client_id,会带 nonce / at_hash / sid / auth_time。 |
拿它去调 API;它是给应用读的,不是访问令牌 |
| access token | 访问受保护资源的凭据,本课主案例里 aud 是 account,并带角色等授权信息。 |
把它发给前端/存进 localStorage(暴露面完全不同,见 03 章) |
| refresh token | 用来换新 access token 的长寿命凭据。默认会轮换但旧的不作废。 | 以为轮换等于作废——这两件事要分开验证 |
| JWT / 三段结构 | base64url(header).base64url(payload).base64url(signature)。中间段不加密,谁都能读。 |
以为「读不出来」才是安全;安全来自签名与各项校验 |
kid |
header 里的密钥标识,用来在多把密钥并存时选对那把(轮换的前提)。 | 忽略 kid、只用「当前唯一密钥」验签 |
| JWKS | 用 kid 索引的公钥集合。本课实验台的「JWKS」是同进程共享密钥,原因见 07 章。 |
以为 JWKS 里的是私钥或对称密钥 |
at_hash |
把 access token 摘要绑进 ID Token,防止两者被拆开拼接。 | 以为它是 access token 的校验和 |
sid / session_state |
sid 是 IdP 侧会话的标识;session_state 是会随会话状态变化的值,用于前端感知登出。 |
用它替代应用自己的会话;应用仍有自己的会话要管 |
auth_time |
真正的登录认证发生时刻(与 iat 签发时刻不同:刷新时 iat 会变,auth_time 不变)。 |
拿 iat 当「登录时间」 |
| 前/后通道登出(front/back-channel logout) | IdP 通知各应用「这个会话没了」的两条通道:一条经浏览器,一条服务端直连。 | 以为登出是「清一下自己的 cookie」——会话在两侧都要清 |
end_session_endpoint |
IdP 的登出端点;id_token_hint 让 IdP 知道要结束哪条会话。 |
只调它却不处理应用的本地会话 |
| 联邦 / 多 IdP | 一个应用接受多家 IdP 的结论。区分靠 iss / realm / 租户路由配置。 |
以为不同 IdP 下同一个人的 sub 相同——不保证相同 |
| 账号关联(account linking) | 把多家 IdP 的 sub 归到本系统某个账号上。 |
用 email 当主键做关联(邮箱会变、会重名、可被改) |
| reuse detection | 刷新令牌的「检测到旧令牌被再次使用就判为泄露」策略。不是默认开启的。 | 以为轮换本身就等于暴露检测 |
| clock skew / 时间偏移 | 校验方与被校验方时钟不一致带来的 exp / iat 误判。 |
直接把容差窗口开得很大,「顺手」把过期令牌也放进来 |