【发布时间】:2018-08-06 07:25:05
【问题描述】:
我正在和我的同学一起为学校做一个项目,并在 Spring Security 中使用 JWT。我们对在前端解码 JWT 有效负载进行了辩论。前端是用 Angular 完成的。 Oauth 端点返回授权响应如下:
{
"access_token": <access_token>,
"token_type": <bearer>,
"expires_in": <time>,
"scope": <scope>,
"jti": <jti>
}
据我所知,这是标准反应。争论是我们是否应该修改此响应以使其具有用户名和权限。例如:
{
...
"username": <username>
"authorities": <authorities>
}
我认为没有必要,因为有效负载已经包含相同的信息。此外,有效载荷只是 base64 编码。因此,它不能/不得包含任何已经设计好的敏感信息。此外,这似乎是一种安全风险,因为 JWT 是不可变的,但我认为根据响应主体对用户角色做出任何假设都是错误的。我可以拦截响应,并在响应到达前端之前愉快地让自己成为管理员,然后我将被引导到管理员视图(当然,由于 JWT,任何进一步的请求都已经无效)。我有一个想法可能会在应用程序中增加一些额外的安全性。这个想法是您不能对授权请求中的用户及其角色做出任何假设。您只需获取 JWT 并使用 JWT 向端点发出单独的“WhoAmI”请求,这将返回用户名和角色。这样,前端可以将这些值与从授权服务器获得的值进行比较,并可以立即检测这些值是否已被篡改。如果我理解正确,那么授权服务器应该这样做 - 它应该委托访问。
非常感谢您对此事的意见。
【问题讨论】:
标签: angular spring-boot spring-security jwt