Spring 负载均衡器处理时启动 CSRF 失败
Spring Boot CSRF fails when handled by Load balancer
我已经在 spring 启动时使用基于 header 的令牌方法实现了 CSRF 过滤器。当我 运行 在单个服务器上时,我的应用程序运行良好,当我引入另一台服务器或通过负载均衡器请求 serverd(取决于负载均衡器如何服务请求)时,它无法验证另一台服务器提供的令牌。
这里的任何人都可以告诉我我们如何根据特定密钥为 CSRF 创建令牌,该密钥对于所有服务器都是相同的,并且每个服务器都将访问相同的密钥以识别用户,或者以其他方式共享 CSRF 令牌在不同的服务器中。
有两种方法可以解决此问题:
将您的负载平衡器配置为 use/work 具有粘性会话。
例如,如果您使用 Nginx 作为负载均衡器,您可以浏览以下链接:
如果您不想使用粘性会话,则可以使用 Spring 会话,因为默认情况下 CSRF 令牌存储在 HTTP 会话中。
因此您需要复制 HTTP 会话。您可以使用 Spring Session.
参考以下链接:
- https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html
- https://blog.jayway.com/2015/05/31/scaling-out-with-sprin
g-会话/
您需要有一个尚未安装的 Redis 服务器 installed.If 您可以按照以下步骤操作:
Redis
Download 并安装 Redis。例如,如果您使用 OS X,则可以使用 Brew,例如
$ brew install redis
(如果您使用 Linux,您可以使用 yum
或 apt-get
。或者,阅读快速入门指南。)
调用redis-server命令启动Redis,例如如果您在 OS X:
上使用 Brew
$ redis-server /usr/local/etc/redis.conf
[...]
端口:6379
[...]
服务器启动,Redis版本3.0.1
[...]
我已经在 spring 启动时使用基于 header 的令牌方法实现了 CSRF 过滤器。当我 运行 在单个服务器上时,我的应用程序运行良好,当我引入另一台服务器或通过负载均衡器请求 serverd(取决于负载均衡器如何服务请求)时,它无法验证另一台服务器提供的令牌。
这里的任何人都可以告诉我我们如何根据特定密钥为 CSRF 创建令牌,该密钥对于所有服务器都是相同的,并且每个服务器都将访问相同的密钥以识别用户,或者以其他方式共享 CSRF 令牌在不同的服务器中。
有两种方法可以解决此问题:
将您的负载平衡器配置为 use/work 具有粘性会话。 例如,如果您使用 Nginx 作为负载均衡器,您可以浏览以下链接:
如果您不想使用粘性会话,则可以使用 Spring 会话,因为默认情况下 CSRF 令牌存储在 HTTP 会话中。
因此您需要复制 HTTP 会话。您可以使用 Spring Session.
参考以下链接:
- https://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html
- https://blog.jayway.com/2015/05/31/scaling-out-with-sprin g-会话/
您需要有一个尚未安装的 Redis 服务器 installed.If 您可以按照以下步骤操作:Redis
Download 并安装 Redis。例如,如果您使用 OS X,则可以使用 Brew,例如
$ brew install redis
(如果您使用 Linux,您可以使用
yum
或apt-get
。或者,阅读快速入门指南。)调用redis-server命令启动Redis,例如如果您在 OS X:
上使用 Brew$ redis-server /usr/local/etc/redis.conf
[...]
端口:6379
[...]
服务器启动,Redis版本3.0.1
[...]