网易首页 > 网易号 > 正文 申请入驻

【186期】面试官问:OAuth2 vs JWT,到底怎么选择?

0
分享至

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方有惊喜,留言必回,有问必答!

每天08:35更新文章,每天进步一点点...

本文会详细描述两种通用的保证API安全性的方法:OAuth2和JSON Web Token (JWT)

假设:

  • 你已经或者正在实现API;

  • 你正在考虑选择一个合适的方法保证API的安全性;

要比较JWT和OAuth2?首先要明白一点就是,这两个根本没有可比性,是两个完全不同的东西。

  • JWT是一种认证协议 JWT提供了一种用于发布接入令牌(Access Token),并对发布的签名接入令牌进行验证的方法。令牌(Token)本身包含了一系列声明,应用程序可以根据这些声明限制用户对资源的访问。

  • OAuth2是一种授权框架 另一方面,OAuth2是一种授权框架,提供了一套详细的授权机制(指导)。用户或应用可以通过公开的或私有的设置,授权第三方应用访问特定资源。既然JWT和OAuth2没有可比性,为什么还要把这两个放在一起说呢?实际中确实会有很多人拿JWT和OAuth2作比较。标题里把这两个放在一起,确实有误导的意思。很多情况下,在讨论OAuth2的实现时,会把JSON Web Token作为一种认证机制使用。这也是为什么他们会经常一起出现。

先来搞清楚JWT和OAuth2究竟是干什么的?

JSON Web Token (JWT)

JWT在标准中是这么定义的:

JWT是一种安全标准。基本思路就是用户提供用户名和密码给认证服务器,服务器验证用户提交信息信息的合法性;如果验证成功,会产生并返回一个Token(令牌),用户可以使用这个token访问服务器上受保护的资源。

一个token的例子:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

一个token包含三部分:

header.claims.signature

了安全的在url中使用,所有部分都 base64 URL-safe进行编码处理。

Header头部分头部分简单声明了类型(JWT)以及产生签名所使用的算法。

{ "alg" : "AES256", "typ" : "JWT"}

Claims声明

声明部分是整个token的核心,表示要发送的用户详细信息。有些情况下,我们很可能要在一个服务器上实现认证,然后访问另一台服务器上的资源;或者,通过单独的接口来生成token,token被保存在应用程序客户端(比如浏览器)使用。一个简单的声明(claim)的例子:

{ "sub": "1234567890", "name": "John Doe", "admin": true}

Signature签名

签名的目的是为了保证上边两部分信息不被篡改。如果尝试使用Bas64对解码后的token进行修改,签名信息就会失效。一般使用一个私钥(private key)通过特定算法对Header和Claims进行混淆产生签名信息,所以只有原始的token才能于签名信息匹配。这里有一个重要的实现细节。只有获取了私钥的应用程序(比如服务器端应用)才能完全认证token包含声明信息的合法性。所以,永远不要把私钥信息放在客户端(比如浏览器)。

相反,OAuth2不是一个标准协议,而是一个安全的授权框架。它详细描述了系统中不同角色、用户、服务前端应用(比如API),以及客户端(比如网站或移动App)之间怎么实现相互认证。

这里简单说一下涉及到的基本概念。

Roles角色应用程序或者用户都可以是下边的任何一种角色:

  • 资源拥有者

  • 资源服务器

  • 客户端应用

  • 认证服务器

Client Types客户端类型这里的客户端主要指API的使用者。它可以是的类型:

  • 私有的

  • 公开的

Client Profile客户端描述OAuth2框架也指定了集中客户端描述,用来表示应用程序的类型:

  • Web应用

  • 用户代理

  • 原声应用

Authorization Grants认证授权认证授权代表资源拥有者授权给客户端应用程序的一组权限,可以是下边几种形式:

  • 授权码

  • 隐式授权

  • 资源拥有者密码证书

  • 客户端证书

  • Endpoints终端

OAuth2框架需要下边几种终端:

  • 认证终端

  • Token终端

  • 重定向终端

从上边这些应该可以看出,OAuth2定义了一组相当复杂的规范。

一些重要的实施考虑在做选择之前,参考一下下边提到的几点。

时间投入OAuth2是一个安全框架,描述了在各种不同场景下,多个应用之间的授权问题。有海量的资料需要学习,要完全理解需要花费大量时间。甚至对于一些有经验的开发工程师来说,也会需要大概一个月的时间来深入理解OAuth2。这是个很大的时间投入。相反,JWT是一个相对轻量级的概念。可能花一天时间深入学习一下标准规范,就可以很容易地开始具体实施。

出现错误的风险OAuth2不像JWT一样是一个严格的标准协议,因此在实施过程中更容易出错。尽管有很多现有的库,但是每个库的成熟度也不尽相同,同样很容易引入各种错误。在常用的库中也很容易发现一些安全漏洞。当然,如果有相当成熟、强大的开发团队来持续OAuth2实施和维护,可以一定成都上避免这些风险。

社交登录的好处在很多情况下,使用用户在大型社交网站的已有账户来认证会方便。如果期望你的用户可以直接使用Facebook或者Gmail之类的账户,使用现有的库会方便得多。

结论

做结论前,我们先来列举一下 JWT和OAuth2的主要使用场景。

无状态的分布式API

JWT的主要优势在于使用无状态、可扩展的方式处理应用中的用户会话。服务端可以通过内嵌的声明信息,很容易地获取用户的会话信息,而不需要去访问用户或会话的数据库。在一个分布式的面向服务的框架中,这一点非常有用。但是,如果系统中需要使用黑名单实现长期有效的token刷新机制,这种无状态的优势就不明显了。

优势

  • 快速开发

  • 不需要cookie

  • JSON在移动端的广泛应用

  • 不依赖于社交登录

  • 相对简单的概念理解

  • 另外,面试题微信小程序Java精选面试题

限制

  • Token有长度限制

  • Token不能撤销

  • 需要token有失效时间限制(exp)

  • OAuth2使用场景

在作者看来两种比较有必要使用OAuth2的场景: 外包认证服务器

上边已经讨论过,如果不介意API的使用依赖于外部的第三方认证提供者,你可以简单地把认证工作留给认证服务商去做。也就是常见的,去认证服务商(比如facebook)那里注册你的应用,然后设置需要访问的用户信息,比如电子邮箱、姓名等。当用户访问站点的注册页面时,会看到连接到第三方提供商的入口。用户点击以后被重定向到对应的认证服务商网站,获得用户的授权后就可以访问到需要的信息,然后重定向回来。

优势

  • 快速开发

  • 实施代码量小

  • 维护工作减少

大型企业解决方案

如果设计的API要被不同的App使用,并且每个App使用的方式也不一样,使用OAuth2是个不错的选择。考虑到工作量,可能需要单独的团队,针对各种应用开发完善、灵活的安全策略。当然需要的工作量也比较大!这一点,OAuth2的作者也指出过:

优势

  • 灵活的实现方式

  • 可以和JWT同时使用

  • 可针对不同应用扩展

进一步
  • http://jwt.io - JWT官方网站,也可以查看到使用不同语言实现的库的状态。

  • http://oauth.net/2/ OAuth2官方网站, 也也可以查看到使用不同语言实现的库的状态。

  • OAuth 2 tutorials - Useful overview of how OAuth 2 works.

  • Oauth2 Spec issues Eran Hammer’s (推进OAuth标准的作者) views on what went wrong with the OAuth 2 spec process. Whatever your own opinion, good to get some framing by someone who understand’s key aspects of what make a security standard successful.

  • Thoery and implemnetation: with Laravel and Angular Really informative guide to JWT in theory and in practice for Laravel and Angular.

作者:乐傻驴 www.jianshu.com/p/1f2d6e5126cb

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

------ THE END ------

精品资料,超赞福利!


3000+ 道面试题在线刷,最新、最全 Java 面试题!

期往精选 点击标题可跳转

技术交流群!

最近有很多人问,有没有读者&异性交流群,你懂的!想知道如何加入。加入方式很简单,有兴趣的同学,只需要点击下方卡片,回复“加群”,即可免费加入交流群!

文章有帮助的话,在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
缅中边贸几乎全部停滞!边境大米商只能通过海运出口大米

缅中边贸几乎全部停滞!边境大米商只能通过海运出口大米

缅甸中文网
2024-06-16 15:06:40
深入讲一下姜萍为什么要用国外的英文教材!

深入讲一下姜萍为什么要用国外的英文教材!

妮子说美食
2024-06-16 08:15:04
周鸿祎:嫌360广告弹窗多,可以用极速版,想免费,就要接受广告

周鸿祎:嫌360广告弹窗多,可以用极速版,想免费,就要接受广告

科技Nice
2024-06-15 17:14:28
《玫瑰的故事》播出一半后才发现,刘亦菲根本不是天选的“玫瑰”

《玫瑰的故事》播出一半后才发现,刘亦菲根本不是天选的“玫瑰”

兰子记
2024-06-15 20:36:41
纳达尔土豪身份尽显!在法网首轮佩戴800万奢侈手表,无愧三巨头

纳达尔土豪身份尽显!在法网首轮佩戴800万奢侈手表,无愧三巨头

搏击江湖
2024-06-16 10:24:30
身高191体重180火遍全网的马丁-亚当:上届欧洲杯我在家喝酒

身高191体重180火遍全网的马丁-亚当:上届欧洲杯我在家喝酒

直播吧
2024-06-16 17:34:10
头部主播也卖不动了,抖音有点慌

头部主播也卖不动了,抖音有点慌

品牌营销官
2024-06-14 19:32:38
打败美元的不是人民币,而是电动汽车?73%石油进口的我们没退路

打败美元的不是人民币,而是电动汽车?73%石油进口的我们没退路

股海风云大作手
2024-06-15 18:28:27
荷兰VS波兰首发:范戴克迎欧洲杯首秀!8千万红星先发,莱万伤缺

荷兰VS波兰首发:范戴克迎欧洲杯首秀!8千万红星先发,莱万伤缺

我爱英超
2024-06-16 20:01:02
两性羞羞:女生长期不啪啪,到底会怎么样?

两性羞羞:女生长期不啪啪,到底会怎么样?

喜马拉雅主播暮霭
2024-06-16 11:32:30
半场-上海申花暂1-1成都蓉城 蒋圣龙乌龙球马莱莱单刀扳平

半场-上海申花暂1-1成都蓉城 蒋圣龙乌龙球马莱莱单刀扳平

直播吧
2024-06-16 20:25:31
理想车友聚会多车连环追尾的瓜

理想车友聚会多车连环追尾的瓜

一个岛岛
2024-06-16 16:42:12
太逗!张常宁助中国女排逆转世界第一 被老公晒丑照 两人相爱相杀

太逗!张常宁助中国女排逆转世界第一 被老公晒丑照 两人相爱相杀

林小湜体育频道
2024-06-16 15:53:29
姜萍妈妈回老家:母女开心庆贺,父亲手捧鲜花,亲戚一起大团聚

姜萍妈妈回老家:母女开心庆贺,父亲手捧鲜花,亲戚一起大团聚

素素娱乐
2024-06-16 08:19:00
同村人评价火爆全网的“数学天才少女”:孩子聪明又懂事

同村人评价火爆全网的“数学天才少女”:孩子聪明又懂事

央广网
2024-06-16 00:30:04
四川火了,投资19亿的新大学落户成都,占地481亩,预计年底竣工

四川火了,投资19亿的新大学落户成都,占地481亩,预计年底竣工

手工制作阿爱
2024-06-16 16:34:01
土耳其遭女排逆转后再迎6噩耗:世界排名跌至第3 奥运抽签掉至2档

土耳其遭女排逆转后再迎6噩耗:世界排名跌至第3 奥运抽签掉至2档

颜小白的篮球梦
2024-06-16 19:01:30
成都蓉城新任董事长现身客场看台,和远征球迷们一起助威

成都蓉城新任董事长现身客场看台,和远征球迷们一起助威

懂球帝
2024-06-16 18:49:10
辛芷蕾电影节红毯身穿香奈儿高定,粉丝:虽然高定难借但真的难看

辛芷蕾电影节红毯身穿香奈儿高定,粉丝:虽然高定难借但真的难看

综艺拼盘汇
2024-06-16 14:30:27
美媒:中国已经“出手”了,而美国感到紧张了

美媒:中国已经“出手”了,而美国感到紧张了

新时光点滴
2024-06-16 04:40:02
2024-06-16 20:52:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

科技要闻

iPhone 16会杀死大模型APP吗?

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

房产
时尚
健康
家居
军事航空

房产要闻

万华对面!海口今年首宗超百亩宅地,重磅挂出!

伊姐周日热推:电影《沙漏》;动漫《眷思量2》......

晚餐不吃or吃七分饱,哪种更减肥?

家居要闻

空谷来音 朴素留白的侘寂之美

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版