原文: Authentication vs Authorization – What's the Difference?

在开发的过程中,常常听说认证(authentication)和授权(authorization),它们的缩写都为auth,所以非常容易混淆。

通过这篇文章,你将学习到:

  • 认证和授权的区别
  • 它们的运行过程是什么样
  • 日常生活中的认证和授权示例

让我们开始吧!

什么是认证?

认证(Authentication)是验证用户提供的或者存储在系统的证书,证明用户就是他们所说的人的过程。如果证书相符,就授予访问权,如果不符,就拒绝访问。

认证的方法

单因素认证:

这种认证方式常被应用在低风险的系统中。只需要提供一种因素来进行认证,通常是密码,所以特别容易受到钓鱼和键盘记录器攻击。

除此之外,最近由DataProt发布的文章显示,有78%的Z时代青年在多个服务使用同一个密码。也就是说一旦攻击者得到一个账号的密码,就非常有可能通过同样的密码截获其他的服务账户。

双因素认证:

这种方法更安全,因为它包含两个身份验证因素——通常是你知道的元素,例如用户名和密码,加上你拥有的东西,例如手机短信或安全令牌。

双因素身份验证流程是,你输入发送到设备的一次性SMS密码,或者是链接一段身份验证器应用程序代码,并提供不断变化的访问代码。

如你所想,这比简单地输入密码或单个身份验证凭据要安全得多。你需要知道登录凭据,并有权访问第二部分的物理设备(上文中的手机等)。

近年来,双因素身份验证在在线服务中变得非常普遍,并且是许多大公司默认的身份验证方法。许多应用要求你设置双因素身份验证才能使用该服务。

多因素身份认证:

进一步让身份验证更加安全的方式是使用3个或者更多因素。这种形式的身份验证通常需要以下前提:

  • 你知道的元素 (用户名 + 密码或者用户名 + 安全问题及答案)
  • 你拥有的元素 (手机sms卡, 验证应用, USB密钥)
  • 属于你的元素 (指纹 / 人脸识别)

由于以上原因,多因素身份验证提供最强大的保护,你必须满足多个因素才能够通过验证,而这些因素通常非常难以被“黑掉”或者造假。

这种认证方式的弊端,也就是为什么普通公司通常不使用这样的认证系统,是因为设置和维护这样的系统十分复杂。所以你想要保护的系统或者数据若想要采取这种方式的话需要做好利弊的权衡。

所以,我们需要认证多少信息?

许多安全架构会议都会讨论这个问题,答案是“因人而异”。

公司根据应用的特性来结合多种认证方式以提高安全性的例子并不少见。

以银行应用为例,这类应用包含了高敏感信息,如果被恶意利用将造成重大的财政和信用影响。银行通常会结合个人问题以及客户号码还有复杂的密码一起验证身份。

但对于社交媒体网站,你可能只需要提供用户名和密码就可以通过检验并访问网站。

Auth_Process-1

认证级别的选择主要是由风险的程度以及在应用中用户可以访问的区域而决定的。

如果你或团队低估了应用程序所需的身份验证级别,你可能会因未充分保护系统内的数据而受到起诉。因此,公司雇用安全专家就最佳实践和适当的解决方案提供建议。

现实世界中,认证是如何运作的?

让我们以社交媒体账号为例。你选择登陆你最喜欢的社交媒体网站(部署在某个服务器上)。在登陆页面,服务器会要求你提供凭证来访问网站,你可以在这里输入你的用户名和密码,这些信息是你在创建账号的时候创建。

展现认证过程的图片
展现认证过程的图片

这些数据会发送到服务器,然后认证的过程就开始了。服务器数据库会检查验证你提供的信息,如果检验一致,你就通过认证。然后你得到一种身份识别数据,例如cookie或者JSON Web令牌(JWT令牌)。

成功!你通过的认证,并且可以访问网站了。

你可以在freeCodeCamp跟着Beau Carnes学习更多JWT令牌的内容。点击这里

接下来让我们看一看什么是授权。

什么是授权?

授权指的是你被允许访问应用的某个区域或者运行特定的行为,允许是建立在应用的特定标准和条件下的。它也被称为访问控制或者权限控制。

授权可以授予或者拒绝执行任务、访问应用某些区域的权利。

让我们看个例子:

我们已经可以访问社交媒体网站了,但是我们能够在网站做什么是由我们被授权的内容决定的。

如果我们尝试去访问非好友的页面(它们不接受我们的连接请求),我们就未被授权查看它们的页面。这就意味着我们被拒绝查看它们的发布的帖子。

授权流程示意图
授权流程示意图

如何执行授权

根据框架的不同,你可以选择不同的执行授权的方式。

例如在.NET框架中,你可以使用基于角色的访问控制或者基于声明的访问控制。

基于角色的访问控制的核心是,在你的系统中每个用户都被分配了一个角色。这些角色有与之相关的预定义的权限。被授予一个角色意味着用户将自动继承所有这些权限。角色是在用户创建和设置时分配。

若用户尝试访问管理区域,终端或者网站检查当前已登陆的用户是否为管理角色(Admin)。

这种方式的弊端是有时候用户被赋予了过多没有必要的权利。

例如,授予用户 Admin(管理角色),意味着给予他Advanced Create(高级创建)、 Edit(编辑)、Delete(删除)以及View(查看)等特权,但你可能只想给予他View(查看)和 Basic Create(基础创建)的权利。

基于声明的访问控制可以允许对特定用户的权限进行更精细的调整。应用程序可以检查声明是否仅存在于用户身上,或者是否为声明分配了特定值。

例如,当创建用户时,一个被称作CreateUser的声明被赋予给用户。你也可以将Advanced变量赋予同一个声明,就可以根据变量到底是 Advanced 还是Basic来决定不同的行为的交互。

认证和授权的区别是什么?

现在我们已经更了解这两个术语,让我们通过一个你可能熟悉的场景来深入理解它们的区别。

在拥有专属宾客名单的晚宴上,每位宾客都会获得一个昵称和一个密码。

当你到达宴会门口的时候,一个安保会要求你提供昵称和密码,然后它们通过清单认证 你的凭证。如果信息匹配,就递给你一个信封,告知你可以进入宴会。

一旦被宴会准入,你就可以自由访问宴会的任意公共领域和场馆,因为这些地区不需要授权 (每一个都有权享受宴会)。 但是,你或许想要瞧一瞧VIP区域。

当你靠近VIP区域的时候,另一个安保要求你打开信封(你的权限和角色)。他们查看之后,发现你不具备VIP资格。这样你就未被授权 访问。简言之,身份验证查验用户身份或者可以访问的服务,而授权确定他们进入后可以做什么。

为什么要同时实现身份验证和授权?

如你所见,尽管身份验证和授权非常不同,但它们都在应用程序或系统的安全性和完整性方面发挥着不可或缺的作用。

它们是相互依存,共同发挥作用的。如果你可以访问管理区域,但是一旦进入你就任意妄为,这可能会导致大麻烦。

另一方面,不能在不知道他是谁的情况下授权个人!这就是为什么身份验证总是在授权之前进行的原因。

结束语

希望这篇文章对你有所启发,并且让你对认证和授权有了更清晰的理解,以及知道如何使用它们:

请记住:

  • 认证 = 验证用户身份或进程。
  • 授权 = 确定用户/系统是否有权使用资源或执行操作。

如果你想要和我讨论更多本文相关内容,欢迎在Twiiter上找到我!@gweaths