Java 身份验证期间使用JWT令牌反序列化cookie无法正确反序列化
我在使用Spring Security为无状态应用程序反序列化cookie时遇到问题 呼叫Java 身份验证期间使用JWT令牌反序列化cookie无法正确反序列化,java,spring,spring-boot,kotlin,spring-security,Java,Spring,Spring Boot,Kotlin,Spring Security,我在使用Spring Security为无状态应用程序反序列化cookie时遇到问题 呼叫https://localhost:8080/login和成功身份验证将生成一个cookie,其中包含JWT令牌和一些其他字段,尤其是安全,HttpOnly,SameSite=None。例如,它看起来如下所示(令牌仅在本地工作,已过期且不包含有用信息,可以随意窃取): 我使用了自签名证书和.jks文件将https添加到本地主机调用中,以测试身份验证流。我还测试了这款饼干在《失眠/邮递员》中的设置是否正确 我
https://localhost:8080/login
和成功身份验证将生成一个cookie,其中包含JWT令牌和一些其他字段,尤其是安全
,HttpOnly
,SameSite=None
。例如,它看起来如下所示(令牌仅在本地工作,已过期且不包含有用信息,可以随意窃取):
我使用了自签名证书和.jks文件将https添加到本地主机调用中,以测试身份验证流。我还测试了这款饼干在《失眠/邮递员》中的设置是否正确
我的Spring安全配置现在要求每个请求都有一个带有有效令牌的cookie。这个很好用。但是,当我试图要求令牌在请求中具有与设置时相同的字段时,我遇到了一个问题:
require(cookieContainingToken.isHttpOnly
&& cookieContainingToken.secure
&& cookieContainingToken.name == "token")
使用调试器,我可以看到cookie存在并包含正确的令牌,但不再是httpOnly且不安全。路径为空,域为空,最大值为-1。此外,Spring使用的javax.servlet.http.Cookie
类似乎没有sameSite属性。显然,cookie的反序列化并不完全有效
有没有办法使传入请求上的cookie反序列化正常工作?或者我应该简单地忽略传入请求的这些属性而只是验证令牌吗?就
HttpOnly
、Max Age
和Secure
si的相关性而言,这些属性的存在有助于减轻主要来自客户端的风险,比如客户端脚本访问受保护的cookie(如果浏览器支持),用于通过安全通信进行传输,并通过Javascript限制访问
你肯定需要像我们的spring boot应用一样在源代码处设置这些。我不知道操纵cookie道具背后的原因,但无论如何,除了jwt令牌声明和签名之外,你不会验证这些道具
签名jwt的美妙之处在于,即使有人能够窃取它,除非他拥有签名密钥,否则它也无法使用。因此,您的代币在您身边是安全的
IMHO JWT不是为客户端读取/解密或使用它而设计的,只是您应该接收它,从而验证调用方
为了增加您的安全性,您可以使用org.jasypt.util.text.StrongTextEncryptor
对您的签名jwt
进行加密,这样它对除您之外的任何人都毫无价值
此外,如果您使用,
access
和refresh
令牌,您可以保留不同的签名密钥。就HttpOnly
、Max Age
和Secure
的相关性而言,这些设置有助于减轻主要来自客户端的风险,如客户端脚本访问g受保护的cookie(如果浏览器支持),用于通过安全通信进行传输,并通过Javascript限制访问
你肯定需要像我们的spring boot应用一样在源代码处设置这些。我不知道操纵cookie道具背后的原因,但无论如何,除了jwt令牌声明和签名之外,你不会验证这些道具
签名jwt的美妙之处在于,即使有人能够窃取它,除非他拥有签名密钥,否则它也无法使用。因此,您的代币在您身边是安全的
IMHO JWT不是为客户端读取/解密或使用它而设计的,只是您应该接收它,从而验证调用方
为了增加您的安全性,您可以使用org.jasypt.util.text.StrongTextEncryptor
对您的签名jwt
进行加密,这样它对除您之外的任何人都毫无价值
此外,如果使用,您还可以为access
和refresh
令牌保留不同的签名密钥
require(cookieContainingToken.isHttpOnly
&& cookieContainingToken.secure
&& cookieContainingToken.name == "token")