在身份验证期间使用jwt令牌反序列化cookie无法正确反序列化

zrfyljdw  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(253)

使用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反序列化正常工作?或者我应该忽略传入请求的这些属性而只是验证令牌吗?

6yjfywim

6yjfywim1#

至于 HttpOnly , Max-Age 以及 Secure 就si而言,这些都是为了帮助减轻主要来自客户端的风险,比如客户端脚本访问受保护的cookie(如果浏览器支持),通过安全通信进行传输,并通过javascript限制访问。
你肯定需要在源代码处设置这些,就像我们的spring boot应用程序一样。我不知道背后的原因操纵cookie道具,但无论如何你不会去验证这些除了jwt令牌声明与签名。
签名jwt的妙处在于,即使有人能够窃取它,除非他拥有签名密钥,否则它也无法使用。所以你的代币是安全的。
imho jwt不是为客户机读取/解密或使用它而设计的,只是您应该接收它,从而验证调用者。
为了增加您的安全性,为了可以加密您的 signed jwtorg.jasypt.util.text.StrongTextEncryptor 所以它对任何人都毫无价值,除了你。
您还可以为这两种类型保留不同的签名密钥 access 以及 refresh 如果你使用代币。

相关问题