Ste*_*ane 37 spring-security basic-authentication jwt
我有一个Spring REST应用程序,它首先使用基本身份验证进行保护.
然后我添加了一个登录控制器,它创建了一个JWT JSON Web令牌,用于后续请求.
我可以将以下代码移出登录控制器并进入安全过滤器吗?然后我不再需要登录控制器了.
tokenAuthenticationService.addTokenToResponseHeader(responseHeaders, credentialsResource.getEmail());
Run Code Online (Sandbox Code Playgroud)
或者我可以删除基本身份验证吗?
将基本身份验证与JWT混合是一种好的设计吗?
虽然一切正常,但我在这里有点黑暗,以便最好地设计这种安全性.
Les*_*ood 77
假设所有通信都有100%TLS - 在登录期间和登录后的所有时间 - 通过基本身份验证使用用户名/密码进行身份验证并在交换中接收JWT是一个有效的用例.这几乎就是OAuth 2的一个流程('密码授权')的工作方式.
我们的想法是通过一个端点对最终用户进行身份验证,例如/login/token使用您想要的任何机制,并且响应应该包含要在所有后续请求中发回的JWT.JWT应该是一个JWS(即加密签名的JWT),具有正确的JWT expiration(exp)字段:这可以确保客户端无法操纵JWT或使其活动时间超过应有的时间.
您也不需要X-Auth-Token标头:HTTP身份验证Bearer方案是为这个确切的用例创建的:基本上任何跟踪Bearer方案名称的信息都是应该验证的"承载"信息.你只需设置Authorization标题:
Authorization: Bearer <JWT value here>
Run Code Online (Sandbox Code Playgroud)
但是,话虽如此,如果您的REST客户端是"不受信任的"(例如支持JavaScript的浏览器),我甚至不会这样做:HTTP响应中可通过JavaScript访问的任何值 - 基本上任何标头值或响应正文值 - 可以通过MITM XSS攻击嗅探和截获.
最好将JWT值存储在仅安全的纯http cookie中(cookie config:setSecure(true),setHttpOnly(true)).这可以保证浏览器:
这种方法几乎是您为最佳实践安全所需要做的一切.最后一件事是确保您对每个HTTP请求都有CSRF保护,以确保启动对您站点的请求的外部域无法正常运行.
最简单的方法是使用随机值(例如UUID)设置仅安全(但不是仅限http)cookie.
然后,在对服务器的每个请求中,确保您自己的JavaScript代码读取cookie值并将其设置在自定义标头中,例如X-CSRF-Token,并验证服务器中每个请求的值.外部域客户端无法为您的域的请求设置自定义标头,除非外部客户端通过HTTP选项请求获得授权,因此任何CSRF攻击尝试(例如在IFrame中,无论如何)都将失败.
对于我们所知的网络上的不受信任的JavaScript客户端,这是最好的安全性.如果你好奇的话,Stormpath还写了一篇关于这些技巧的文章.
最后,Stormpath Java Servlet插件 已经为您完成了所有这些(以及更多很酷的东西,包括额外的自动安全检查),因此您不必编写它 - 或者更糟 - 自己维护它.查看HTTP Request Authentication部分和Form/Ajax示例,了解如何使用它.HTH!
| 归档时间: |
|
| 查看次数: |
17192 次 |
| 最近记录: |