在纯前端单页应用(Single Page Application, SPA)架构中,由于 JavaScript 代码与网络请求在客户端完全透明,应用无法安全存储任何客户端密钥(Client Secret),因此 SPA 被 OAuth 2.0 规范定义为“公共客户端”(Public Client)。过往在 SPA 中广泛采用的“隐式许可模式”(Implicit Flow)直接在 URL Hash 片段中返回 Access Token,极易遭受浏览器历史记录泄露与 Referer 劫持。当前行业安全标准明确要求 SPA 采用带有 PKCE(Proof Key for Code Exchange)的授权码模式(Authorization Code Flow)。PKCE 的核心防御逻辑如下:生成验证码:客户端本地随机生成一个高熵加密字符串作为代码验证器(Code Verifier):$$\text{Code Verifier} \in [43, 128]
\text{ 字符 (A-Z, a-z, 0-9, -, ., _, ~)}$$计算变换哈希:客户端计算其 SHA-256 摘要,并进行 Base64URL 编码生成代码挑战码(Code Challenge):$$\text{Code Challenge} = \text{BASE64URL-ENCODE}(\text{SHA256}(\text{Code Verifier}))$$发起授权请求:前端将用户重定向至授权服务器,并在参数中附带 code_challenge 与 code_challenge_method=S256。获取授权码:用户认证通过后,服务器重定向回前端,回调 URL 中仅携带短期临时 code。换取 Token:SPA 向授权服务器的 /token 端点发送 POST 请求,传入 code 以及最初在内存中保留的明文 code_verifier。授权服务器验证 SHA256(code_verifier) === code_challenge。即便恶意攻击者通过跨站脚本(XSS)或重定向拦截窃取了临时 code,但由于没有对应内存中的 code_verifier,依然无法完成 Token 兑换,彻底消除了中间人授权码注入漏洞。