OAuth 和 OpenId Connect 令牌说明
OAuth and OpenId Connect Tokens clarification
我对 OAuth 和 OpenId Connect 做了一些扎实的研究(恕我直言)。但是我仍然不完全确定要保护每个令牌免受什么以及如何保护。让我们暂时搁置刷新令牌,让我们关注 ID 令牌和访问令牌。从安全的角度来看,两者必须同等对待。它们不得泄漏 public,因此只能与 HTTPS 一起使用,并避免在客户端存储未受保护的 read/usage。由此,我假设在一个简单的网站(服务器端是 JWT 的发行者)的情况下,我只能使用 httpOnly cookies(XSS、CRFS 保护、库泄漏)来存储令牌。可以在 cookie 中存储访问令牌(直接或包装在 ID 令牌中作为声明)吗(我不考虑令牌与会话 ID 的大小)或者我应该将其存储为服务器端因此使用经典会话解决方案一个简单的网站的情况?
如果是 SPA <-> API (<-> API...) 我 should/must 使用 Bearer token 解决方案?
我认为我理解正确但想确定。
谢谢
理想情况下,您应该将令牌存储在后端,并可能在客户端和后端之间使用简单的 session cookie。
某些服务(如 ASP.NET Core)默认将令牌存储为 cookie。为了保护 cookie,他们会在将其发送到浏览器之前对其进行加密。所以这意味着即使cookie被盗,也无法解密,因此令牌是安全的。
是的,cookie 的大小会很大,但是 ASP.NET Core 通过将大的 cookie 分成 4 Kb 的块来解决这个问题。如果您使用 HTTP/2 及其 header 压缩,大 cookie 不会影响传输时间。
如果您打算直接从前端应用程序使用访问令牌,通过对 API 进行一些 AJAX 调用,那么您不能将访问令牌保留在 httpOnly 中曲奇饼。您的脚本需要能够访问它。如果您是单页应用程序,则可以将令牌保存在内存中。只要用户不刷新页面,令牌就可以使用。刷新后您可以执行静默登录以从后端获取新令牌。
如果您有一个简单的网站,并且不直接从前端执行对 APIs 的任何调用,我会坚持使用普通的旧会话。在这种情况下,您不会通过会话使用访问令牌获得任何额外价值。
In the case of SPA <-> API (<-> API...) I should/must use the Bearer token solution?
不确定你在这里问什么。如果您的意思是在 SPA 和 API 之间进行通信的情况下,您必须在授权 header 中使用访问令牌而不是发送 cookie,那么是的,您是对的。如果你问你是否必须使用不记名令牌,那么没有 - 有一种叫做 sender-constrained 令牌的东西,这意味着访问令牌绑定到它颁发给的客户端。
我对 OAuth 和 OpenId Connect 做了一些扎实的研究(恕我直言)。但是我仍然不完全确定要保护每个令牌免受什么以及如何保护。让我们暂时搁置刷新令牌,让我们关注 ID 令牌和访问令牌。从安全的角度来看,两者必须同等对待。它们不得泄漏 public,因此只能与 HTTPS 一起使用,并避免在客户端存储未受保护的 read/usage。由此,我假设在一个简单的网站(服务器端是 JWT 的发行者)的情况下,我只能使用 httpOnly cookies(XSS、CRFS 保护、库泄漏)来存储令牌。可以在 cookie 中存储访问令牌(直接或包装在 ID 令牌中作为声明)吗(我不考虑令牌与会话 ID 的大小)或者我应该将其存储为服务器端因此使用经典会话解决方案一个简单的网站的情况? 如果是 SPA <-> API (<-> API...) 我 should/must 使用 Bearer token 解决方案?
我认为我理解正确但想确定。
谢谢
理想情况下,您应该将令牌存储在后端,并可能在客户端和后端之间使用简单的 session cookie。
某些服务(如 ASP.NET Core)默认将令牌存储为 cookie。为了保护 cookie,他们会在将其发送到浏览器之前对其进行加密。所以这意味着即使cookie被盗,也无法解密,因此令牌是安全的。
是的,cookie 的大小会很大,但是 ASP.NET Core 通过将大的 cookie 分成 4 Kb 的块来解决这个问题。如果您使用 HTTP/2 及其 header 压缩,大 cookie 不会影响传输时间。
如果您打算直接从前端应用程序使用访问令牌,通过对 API 进行一些 AJAX 调用,那么您不能将访问令牌保留在 httpOnly 中曲奇饼。您的脚本需要能够访问它。如果您是单页应用程序,则可以将令牌保存在内存中。只要用户不刷新页面,令牌就可以使用。刷新后您可以执行静默登录以从后端获取新令牌。
如果您有一个简单的网站,并且不直接从前端执行对 APIs 的任何调用,我会坚持使用普通的旧会话。在这种情况下,您不会通过会话使用访问令牌获得任何额外价值。
In the case of SPA <-> API (<-> API...) I should/must use the Bearer token solution?
不确定你在这里问什么。如果您的意思是在 SPA 和 API 之间进行通信的情况下,您必须在授权 header 中使用访问令牌而不是发送 cookie,那么是的,您是对的。如果你问你是否必须使用不记名令牌,那么没有 - 有一种叫做 sender-constrained 令牌的东西,这意味着访问令牌绑定到它颁发给的客户端。