使用spring security对无状态应用程序反序列化Cookie时遇到问题。
打电话 https://localhost:8080/login
成功地进行身份验证会产生一个包含jwt令牌和其他一些字段的cookie,特别是 Secure
, HttpOnly
, SameSite=None
. 例如,它看起来如下(令牌只在本地工作,过期并且不包含有用的信息,可以随意窃取):
token=eyJhbGciOiJIUzUxMiJ9.eyJ1c2VySWQiOiI2NzA1ZTk1YS1hOTgzLTRiMDItYmVjOC01ZGFkNDM0MzY0NzAiLCJleHAiOjE2MDkxNzA0Nzd9.9OF_iDuxlZ9Xk9v_YJJTDY0LCQ21mZENnKRafhYKv63KXZ3tkHzSZt0Ngskxp9-yaa10AEY5p1j44cGQ9KY-DQ; Max-Age=1800; Path=/; Secure; HttpOnly; SameSite=none; Domain=localhost
我使用了一个自签名证书和一个.jks文件将https添加到localhost调用中,以测试身份验证流。我还测试了这个饼干在失眠症/ Postman 中的设置是否正确。
我的spring安全配置现在要求每个请求都有一个带有有效令牌的cookie。这个很好用。但是,当我试图要求令牌在请求中具有与设置令牌时相同的字段时,遇到了一个问题:
require(cookieContainingToken.isHttpOnly
&& cookieContainingToken.secure
&& cookieContainingToken.name == "token")
使用调试器,我可以看到cookie存在并且包含正确的令牌,但是不再是httponly并且不安全。路径为空,域为空,最大值为-1。此外 javax.servlet.http.Cookie
spring使用的类似乎没有samesite属性。显然,对cookie的反序列化并不完全有效。
有没有办法让传入请求的cookie反序列化正常工作?或者我应该忽略传入请求的这些属性而只是验证令牌吗?
1条答案
按热度按时间6yjfywim1#
至于
HttpOnly
,Max-Age
以及Secure
就si而言,这些都是为了帮助减轻主要来自客户端的风险,比如客户端脚本访问受保护的cookie(如果浏览器支持),通过安全通信进行传输,并通过javascript限制访问。你肯定需要在源代码处设置这些,就像我们的spring boot应用程序一样。我不知道背后的原因操纵cookie道具,但无论如何你不会去验证这些除了jwt令牌声明与签名。
签名jwt的妙处在于,即使有人能够窃取它,除非他拥有签名密钥,否则它也无法使用。所以你的代币是安全的。
imho jwt不是为客户机读取/解密或使用它而设计的,只是您应该接收它,从而验证调用者。
为了增加您的安全性,为了可以加密您的
signed jwt
与org.jasypt.util.text.StrongTextEncryptor
所以它对任何人都毫无价值,除了你。您还可以为这两种类型保留不同的签名密钥
access
以及refresh
如果你使用代币。