You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Kubernetes Ingress-Nginx与Spring Security粘性会话失效问题求助

解决Ingress-Nginx粘性会话与Spring Security JSESSIONID冲突问题

我之前也碰到过一模一样的坑!核心问题出在Spring Security的会话固定保护机制:默认情况下,用户登录成功后Spring会生成新的JSESSIONID替换旧值,但你的Ingress-Nginx是靠JSESSIONID来做粘性会话绑定的——当这个Cookie值一变,Ingress的哈希逻辑就会把请求转发到新的Pod,导致原有会话丢失,用户直接被踢回登录页。

下面是几个可行的解决方案,按推荐程度排序:

方案一:使用独立的Ingress粘性会话Cookie(首推)

把Ingress的粘性会话Cookie和Spring的JSESSIONID彻底分开,这样Spring修改JSESSIONID完全不会影响Ingress的Pod关联。修改你的Ingress配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/affinity: "cookie"
    # 改成和JSESSIONID不同的专属Cookie名
    nginx.ingress.kubernetes.io/session-cookie-name: "INGRESS_STICKY_COOKIE"
    nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
    nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
    nginx.ingress.kubernetes.io/session-cookie-path: /ingress-test
spec:
  rules:
  - http:
      paths:
      - path: /ingress-test
        backend:
          serviceName: ingress-test
          servicePort: 31080

配置完成后,Ingress-Nginx会自己维护INGRESS_STICKY_COOKIE来绑定用户到固定Pod,Spring的JSESSIONID怎么变都不会影响这个绑定,登录后请求会稳定转发到同一个Pod。

方案二:调整Spring Security的会话固定策略(谨慎使用)

如果必须复用JSESSIONID作为Ingress的粘性Cookie,可以修改Spring Security的会话固定保护规则,但这会降低应用安全性(会话固定攻击的风险会上升)。

在你的Spring Security配置类中,修改会话管理逻辑:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            // 其他配置...
            .sessionManagement(session -> session
                // 迁移会话属性但保留原JSESSIONID,兼顾安全性和粘性会话
                .sessionFixation().migrateSession()
                // 完全禁用JSESSIONID修改(风险极高,不推荐)
                // .sessionFixation().none()
            );
        return http.build();
    }
}

migrateSession会保留原JSESSIONID,但把旧会话的属性迁移到新会话中,既保证Ingress粘性会话不失效,又比直接禁用保护的安全性高一些。

验证步骤

修改配置后,可以通过以下方式确认是否生效:

  • 登录应用后,在浏览器开发者工具的Cookie面板中,确认同时存在Ingress专属粘性Cookie(比如INGRESS_STICKY_COOKIE)和Spring的JSESSIONID
  • 查看Ingress-Nginx的Pod日志,检查登录前后的请求是否都转发到同一个后端Pod(日志中会显示upstream对应的Pod IP)。

内容的提问来源于stack exchange,提问作者savas

火山引擎 最新活动