JWT VS OAuth2, 如何设计一个安全的API接口?,2024年最新网络安全高级工程师必备知识

JWT VS OAuth2, 如何设计一个安全的API接口?,2024年最新网络安全高级工程师必备知识

码农世界 2024-05-27 前端 67 次浏览 0个评论

签名的目的是为了保证上边两部分信息不被篡改。如果尝试使用Bas64对解码后的token进行修改,签名信息就会失效。一般使用一个私钥(private key)通过特定算法对Header和Claims进行混淆产生签名信息,所以只有原始的token才能于签名信息匹配。

这里有一个重要的实现细节。只有获取了私钥的应用程序(比如服务器端应用)才能完全认证token包含声明信息的合法性。所以,永远不要把私钥信息放在客户端(比如浏览器)。

OAuth2是什么?

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

The OAuth 2.0 authorization framework enables a third-party application to obtain limited access to an HTTP service, either on behalf of a resource owner by orchestrating an approval interaction between the resource owner and the HTTP service, or by allowing the third-party application to obtain access on its own behalf. -RFC6749 https://tools.ietf.org/html/rfc6749

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

Roles角色

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

  • 资源拥有者

  • 资源服务器

  • 客户端应用

  • 认证服务器

    Client Types客户端类型

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

    • 私有的

    • 公开的

      Client Profile客户端描述

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

      • Web应用

      • 用户代理

      • 原声应用

        Authorization Grants认证授权

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

        • 授权码

        • 隐式授权

        • 资源拥有者密码证书

        • 客户端证书

        • Endpoints终端

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

          • 认证终端

          • Token终端

          • 重定向终端

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

            使用HTTPS保护用户密码

            在进一步讨论OAuth2和JWT的实现之前,有必要说一下,两种方案都需要SSL安全保护,也就是对要传输的数据进行加密编码。

            安全地传输用户提供的私密信息,在任何一个安全的系统里都是必要的。否则任何人都可以通过侵入私人wifi,在用户登录的时候窃取用户的用户名和密码等信息。

            一些重要的实施考虑

            在做选择之前,参考一下下边提到的几点。

            时间投入

            OAuth2是一个安全框架,描述了在各种不同场景下,多个应用之间的授权问题。有海量的资料需要学习,要完全理解需要花费大量时间。甚至对于一些有经验的开发工程师来说,也会需要大概一个月的时间来深入理解OAuth2。这是个很大的时间投入。

            相反,JWT是一个相对轻量级的概念。可能花一天时间深入学习一下标准规范,就可以很容易地开始具体实施。

            出现错误的风险

            OAuth2不像JWT一样是一个严格的标准协议,因此在实施过程中更容易出错。尽管有很多现有的库,但是每个库的成熟度也不尽相同,同样很容易引入各种错误。在常用的库中也很容易发现一些安全漏洞。

            当然,如果有相当成熟、强大的开发团队来持续OAuth2实施和维护,可以一定成都上避免这些风险。

            社交登录的好处

            在很多情况下,使用用户在大型社交网站的已有账户来认证会方便。

            如果期望你的用户可以直接使用Facebook或者Gmail之类的账户,使用现有的库会方便得多。

            结论

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

            JWT使用场景

            无状态的分布式API

            JWT的主要优势在于使用无状态、可扩展的方式处理应用中的用户会话。服务端可以通过内嵌的声明信息,很容易地获取用户的会话信息,而不需要去访问用户或会话的数据库。在一个分布式的面向服务的框架中,这一点非常有用。

            但是,如果系统中需要使用黑名单实现长期有效的token刷新机制,这种无状态的优势就不明显了。

            优势

            • 快速开发

            • 不需要cookie

            • JSON在移动端的广泛应用

            • 不依赖于社交登录

            • 相对简单的概念理解

              限制

              • Token有长度限制

              • Token不能撤销

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

                OAuth2使用场景

                在作者看来两种比较有必要使用OAuth2的场景:

                外包认证服务器

                上边已经讨论过,如果不介意API的使用依赖于外部的第三方认证提供者,你可以简单地把认证工作留给认证服务商去做。

                也就是常见的,去认证服务商(比如facebook)那里注册你的应用,然后设置需要访问的用户信息,比如电子邮箱、姓名等。当用户访问站点的注册页面时,会看到连接到第三方提供商的入口。用户点击以后被重定向到对应的认证服务商网站,获得用户的授权后就可以访问到需要的信息,然后重定向回来。

                优势

                • 快速开发

                • 实施代码量小

                • 维护工作减少

                  大型企业解决方案

                  如果设计的API要被不同的App使用,并且每个App使用的方式也不一样,使用OAuth2是个不错的选择。

                  考虑到工作量,可能需要单独的团队,针对各种应用开发完善、灵活的安全策略。当然需要的工作量也比较大!这一点,OAuth2的作者也指出过:

                  自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

                  深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

                  因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

                  既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

                  由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

                  如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)

                  学习路线:

                  这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:

                  一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                  这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:

                  一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

                  [外链图片转存中…(img-O1vK1RL6-1712956827080)]

转载请注明来自码农世界,本文标题:《JWT VS OAuth2, 如何设计一个安全的API接口?,2024年最新网络安全高级工程师必备知识》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,67人围观)参与讨论

还没有评论,来说两句吧...

Top