Keycloak因SameSite属性问题登录后重定向回登录页求助
问题根因
Firefox更新至最新版本后调整了Cookie默认策略:所有未显式设置SameSite属性的Cookie,会被默认套用SameSite=Lax规则。该规则会拦截跨站跳转场景下的Cookie携带,你的Angular 12 + Spring Boot 2.2.0 + Keycloak 16 登录链路本身存在多次跨站重定向,Keycloak签发的会话Cookie、Spring Boot的会话Cookie因为未显式声明SameSite属性,在登录完成跳转回业务系统的环节被浏览器拦截不发送,Keycloak和后端都识别不到有效登录态,就会触发重定向回登录页的异常。
修复方案
Keycloak 16 侧配置
Keycloak 16原生支持Cookie SameSite属性配置,无需修改源码,通过启动参数即可完成调整:
- 启动Keycloak时追加以下参数,给所有身份校验相关Cookie设置适配跨站场景的SameSite属性:
# standalone启动模式下追加的JVM参数 -Dkeycloak.cookie.sameSite.cookie.authSession=none -Dkeycloak.cookie.sameSite.cookie.session=none -Dkeycloak.cookie.sameSite.cookie.rememberMe=none
- 浏览器硬规则要求:设置
SameSite=None的Cookie必须同时开启Secure属性,否则会被直接拒绝。生产环境使用HTTPS部署时,同步追加启动参数:
-Dkeycloak.cookie.secure=true
- 本地开发使用HTTP环境时,不要配置
SameSite=None,将上述参数值改为lax即可,同时保证Keycloak、Angular、Spring Boot三个服务同属一个站点(比如本地都使用localhost+不同端口,或通过hosts映射到同一个一级测试域名),Lax策略不会拦截同站跳转的Cookie携带。
Spring Boot 2.2.0 侧配置
Spring Boot 2.2.0内嵌的Tomcat容器默认不会自动给会话Cookie添加SameSite属性,且该版本直接在配置文件中设置SameSite存在兼容问题,需通过代码手动配置:
- 首先在
application.yml中配置会话Cookie基础属性:
server: servlet: session: cookie: secure: true # 生产HTTPS环境设为true,本地HTTP开发环境设为false http-only: true
- 新增配置类,手动注入Cookie SameSite策略:
import org.springframework.boot.web.servlet.server.CookieSameSiteSupplier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CookieSameSiteConfig { @Bean public CookieSameSiteSupplier sessionCookieSameSiteSupplier() { // 生产跨站HTTPS环境返回ofNone(),本地同站开发环境返回ofLax() return CookieSameSiteSupplier.ofNone(); } }
- 如果项目使用Spring Security对接Keycloak的OAuth2登录流程,同步将Security配置中的回调Cookie SameSite策略与上述配置保持一致,避免回调请求丢Cookie。
Angular 12 侧校验配置
Angular侧无需修改核心Cookie逻辑,只需完成两点校验配置:
- 检查
angular.json中的本地serve配置,不要随意开启disableHostCheck、修改publicHost参数,避免本地开发时三个服务被浏览器判定为跨站。 - 给所有携带鉴权信息的跨域请求开启凭证携带配置,可在全局HTTP拦截器中统一添加:
// 全局HTTP拦截器请求改造示例 request = request.clone({ withCredentials: true });
验证步骤
所有配置完成后,清空浏览器对应站点的全部缓存与Cookie,重启三个服务重新走登录流程:
- 打开浏览器开发者工具「应用」-「存储」-「Cookie」面板,检查Keycloak、Spring Boot下发的所有Cookie,均已显式标注SameSite属性(生产环境为
None且勾选了Secure项,本地同站环境为Lax) - 控制台不再输出SameSite相关报错,登录完成后可正常进入业务系统,不会被重定向回登录页
内容的提问来源于stack exchange,提问作者Technologies and studios
相关产品推荐
相关产品推荐

