Spring Security OAuth2 将 access_token 存储在 cookie 中

Posted

技术标签:

【中文标题】Spring Security OAuth2 将 access_token 存储在 cookie 中【英文标题】:Spring Security OAuth2 store access_token in cookie 【发布时间】:2019-06-03 00:48:08 【问题描述】:

我使用Spring Security + Angular。当我向/oauth/token 发出发布请求并获取令牌时:


    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDY5NDQwODYsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiUk9MRV9BRE1JTiJdLCJqdGkiOiI4M2VhMTA1MC05NjczLTRlZGItOTlmMS0yNWIzOTQ1ODdjMmUiLCJjbGllbnRfaWQiOiJmcm9udGVuZCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdfQ.i6v2G70eEgGUt_CdgctcTrGgz_RHs6OuEA8lGHOgVro",
    "token_type": "bearer",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSJdLCJhdGkiOiI4M2VhMTA1MC05NjczLTRlZGItOTlmMS0yNWIzOTQ1ODdjMmUiLCJleHAiOjE1NDk1MzI0ODYsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iXSwianRpIjoiNzQxMDA0NzUtODkxOC00YjM5LTk5NDMtNjAzMWIxMGVjNGQ3IiwiY2xpZW50X2lkIjoiZnJvbnRlbmQifQ.3QOdAL10lQsPSvsFfgyf02gvAanyJ-R1BX_wtF1APB0",
    "expires_in": 3599,
    "scope": "read write",
    "jti": "83ea1050-9673-4edb-99f1-25b394587c2e"

如何在Spring Security 端指定cookie 的安装并在那里保存令牌?还是我必须像这样在Angular 一侧这样做:

Cookie.set("access_token", token.access_token, expireDate);

什么是正确的做法?在我看来,将令牌存储在 cookie 中是一个正确且安全的决定。

【问题讨论】:

【参考方案1】:

访问令牌适用于执行休息调用的用户代理。他们可以安全地存储访问令牌(大多数在安全服务器的内存中进行),并在每次调用时将该令牌传递给服务器。

话虽如此,您的应用程序不应获取该令牌并以 cookie 的形式将其发送到浏览器。

如果您使用的是implicit_grant,那么您的应用程序已被视为安全性较低,因为获取令牌不需要客户端凭据。

在这种情况下,我建议将其保存在应用程序的内存中。如果应用程序必须存储它(以防止重新加载等),请考虑使用local session storage

最坏的情况local storage 将在浏览器关闭后继续存在。

但我认为您在这里不需要 cookie。因为令牌是使用带有 bearer prefix 的授权标头传递给 API 的

Authorization: Bearer AbCdEf123456

希望对你有帮助

【讨论】:

感谢您的回复。但我仍然不明白使用Angular 前端时存储访问令牌的最佳做法。 您将其存储在您的 javascript 应用程序的内存中。 var token = ...; 然后在每个请求中传递它。我确信一些 javascript 框架已经为你做到了。 不要将令牌存储在本地存储中,这是一个安全问题。 你能检查一下my question related to this subject吗?

以上是关于Spring Security OAuth2 将 access_token 存储在 cookie 中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 spring security 与 rest oauth2 服务和 spring social 集成?

Spring Security OAuth2 accessToken

NoClassDefFoundError: javax/xml/bind/UnmarshalException - Spring Security oauth2

在 Spring Security 中具有密码授权的 oAuth2 客户端

Spring Cloud Gateway OAuth2 with Spring Security OAuth2 Authorization Server = loop

Spring Security实现OAuth2.0授权服务 - 进阶版