OAuth与JWT(JSON网络令牌):深入比较
这些认证标准中最重要的两个是OAuth和JWT(JSON网络令牌)。了解JWT令牌和OAuth之间的区别。
认证是当今互联网应用的核心功能之一,是许多开发者都熟悉的功能。然而,真正正确地实施认证需要了解一些标准和协议。
这些认证标准中最重要的两个是OAuth和JWT(JSON网络令牌)。
想了解OAuth和JWT的意义?你来对地方了。
让我们深入了解一下!
什么是OAuth?
OAuth(开放授权)--通常写成最新版本的OAuth 2.0--是一个协议,用于通过认证服务器来认证用户。
OAuth的一个有用之处在于,它使你能够以安全的方式委托账户访问,而无需分享凭证。OAuth依靠的不是凭证,而是访问令牌。
使用访问令牌,客户端应用程序可以验证认证自己的用户的身份。
从视觉上看,这个过程是这样的。
当你实现 "用谷歌登录 "或 "用Github登录 "时,你就在使用OAuth 2.0协议了。
使用OAuth的好处
使用OAuth有一些很大的好处,包括:
- 它是公认的工业标准。这意味着大多数认证服务会理解并使用OAuth 2.0。
- 有许多即插即用的OAuth选项。包括像 "用谷歌登录 "和 "用Facebook登录 "这样的服务,这些服务已经被设置好,可以在你的应用程序中使用了。
- OAuth在几乎所有的语言和网络框架中都有经过良好测试的客户端库。这意味着你所选择的语言可以与OAuth一起使用。
- 它可以实现代码的解耦。你的客户应用程序代码不会受到认证代码的影响。
- OAuth是非常安全和经过战斗考验的。由于其广泛的性质,你可以放心,所有的安全边缘案例都是由行业专家考虑过的。
使用OAuth的潜在考虑因素
虽然OAuth是一个伟大的标准,但在使用时也有一些需要注意的地方:
- 如果你不熟悉,OAuth可能会很复杂,难以理解。有几个不同的OAuth流程,决定哪一个是适合你的,可能是一个挑战。有时,你甚至可能需要使用多个流程。
- 它有低端的用户隐私。auth服务器知道终端用户登录过的所有网站。例如,当一个网站使用Sign in with Google时,Google将能够跟踪该网站的用户何时登录或活跃。
- 在某些情况下,这是矫枉过正的。如果你正在建立一个简单的网络应用,有一个前端和后端,那么你就不需要OAuth协议。然而,很多在线教程和现成的auth解决方案迫使你实施这个。
- 没有会话管理解决方案。一旦用户被认证,认证服务器就会简单地返回一个JWT,它可以被你的应用程序消费(后面会看到)。然而,在这一步之后,OAuth协议并没有提供任何支持,以指定如何维护你的应用程序的前端和后端之间的认证会话 - 这完全取决于开发人员。
什么是JWT(JSON网络令牌)?
JWT是 由认证服务器生成的令牌 ,包含终端用户的信息(如他们的用户ID、电子邮件等)。该信息为JSON格式,可由 客户端应用程序使用密码学进行有效验证。
那么,究竟什么时候使用JWT是合适的?
当你想向一个不受信任的客户端传输一些信息时,最好使用JWT,其方式是让该客户端自己验证有效载荷中包含的信息。
从认证服务器的角度来看,不受信任的客户端是用户试图使用的一个应用程序。从应用程序的后端来看,不受信任的客户端是前端的代码。
使用JWT的优点
JWT成为如此受欢迎的标准,有一些很好的理由:
- 它们是自包含的。JWT可以包含用户的详细信息。因此,你不需要在每次请求时都向数据库/Auth服务器查询该信息。
- 它们提供强大的安全保证。JWTs是经过数字签名的,这保证了它们不会被客户端或攻击者修改。
- JWTs只存储在客户端。你在服务器上生成JWTs并将其发送给客户端。然后,客户端在每个请求中提交JWT。这节省了数据库空间。
- 它们是高效和快速验证的。这是因为JWTs不需要数据库查询。
使用JWT的潜在考虑因素
虽然JWTs非常有用,但记住以下几点是有帮助的:
- 如果不投入大量的额外工程努力,你就不能撤销它们。这是因为在验证它们时没有db调用。为了实现即时撤销,你需要实现JWT黑名单,这可能很耗时。
- 在保持一个秘密安全的同时,很容易产生安全瓶颈。如果签名密钥被破坏,攻击者可以用它来创建他们自己的有效JWTs。这将使他们能够欺骗任何用户和应用程序的身份。
更好的结合:如何同时使用OAuth和JWT
我们已经了解到,OAuth和JWT是在应用程序中构建认证流程的强大标准。事实证明--OAuth与JWT不一定非此即彼--它们可以一起使用!
当认证服务器成功地验证了一个用户的证书(通过OAuth),它还需要将用户的详细信息传输给客户端应用程序。为了让客户端应用程序验证细节,可以使用JWTs来确保一个有效的过程。
其工作原理是,OAuth服务器向客户端发送一个JWT(在OAuth流程完成后),其中包含终端用户的信息。
OAuth服务器发送的JWT中的一个典型的JSON有效载荷看起来就像下面这样(来自于用谷歌登录的例子)。
{
"iss": "https://accounts.google.com",
"azp": "1234987819200.apps.googleusercontent.com",
"aud": "1234987819200.apps.googleusercontent.com",
"sub": "10769150350006150715113082367",
"at_hash": "HK6E_P6Dh8Y93mRNtsDB1Q",
"email": "jsmith@example.com",
"email_verified": "true",
"iat": 1353601026,
"exp": 1353604926,
"nonce": "0394852-3190485-2490358",
"hd": "example.com",
}
所有这些字段是什么意思?下面是用这个特定的例子进行的快速总结:
- iss。令牌的发行者(在本例中是Google)。
- azp和aud。谷歌为您的应用程序发布的客户ID。这样,谷歌就知道哪个网站在尝试使用它的登录服务,而网站也知道JWT是专门为他们签发的。
- 子。最终用户的谷歌用户ID
- at_hash。访问令牌的哈希值。OAuth访问令牌与JWT的不同之处在于,它是一个不透明的令牌。访问令牌的目的是让客户端应用程序可以查询谷歌,以询问更多关于签入用户的信息。
- 电子邮件。终端用户的电子邮件ID
- email_verified。用户是否已经验证了他们的电子邮件。
- iat。JWT的创建时间(从纪元开始的毫秒)。
- exp:JWT创建的时间(自纪元以来的毫秒数)。
- nonce。可由客户端应用程序使用,以防止重放攻击。
- hd。用户的G套件托管域
正如你所看到的,有很多信息从OAuth服务器(在这种情况下是谷歌)传输到客户端应用程序!值得一提的是,上述JSON有效载荷中的一些字段是谷歌特有的(如hd)。其他供应商可能有类似和不同的内容。
由于这些都在JWT中,客户端应用程序可以验证这个JSON的内容,并知道没有人操纵过这些内容。
很多时候,我们看到开发者询问是否要使用 "OAuth或JWT "来进行认证设置。实际上,OAuth和JWT是两个不同的标准,有不同的用途,它们可以一起使用,效果很好。事实上,JWT经常被用作OAuth协议的一部分。