认证和授权的区别与联系

认证(Authentication,缩写为 AuthN)授权(Authorization,缩写为 AuthZ) 是两不同的概念,但是很多人经常把它俩混为一谈,我们首先来明确一下二者的区别和联系。

认证 是为了证明「你是谁」。比如说:

  • 用户名和密码:你输入正确的用户名和密码,系统就认为你是该用户名的所有者。
  • 手机验证码:你输入正确的手机验证码,系统就认为你是该手机号的持有者。
  • 身份证/护照:出示身份证件,系统就认为你是该身份证件的持有者。

授权 是认证完成后的一个流程,为了确认「你能做什么」。比如:

  • 文件系统:在操作系统中,普通用户只能读取某个系统文件,但不能修改或删除它。只有管理员才有修改的权限。
  • 网站系统:在一个论坛里,普通用户可以修改自己的帖子,而管理员可以删除修改任何人的帖子。

另外,我们在工作中也会听到鉴权(Auth)这个词,它是一个宽泛的概念,一般指整个权限控制的过程,即认证 + 授权的组合动作。

总结来说,认证阶段获取用户的唯一标识,授权阶段通过唯一标识确认用户权限。下面用两个实际的例子来辅助理解一下。

酒店入住的例子

先用一个生活中的例子来类比,比方说你预定了一家酒店,现在正在前台办理入住手续。

那么前台首先会让你出示身份证件,并进行人脸验证。

这就是认证阶段,获取并验证你的身份 ID。

前台确认你的真实身份后,会通过身份证号查询你的预订信息,然后给你一张房卡,告诉你:

你的房间号是 209,在明天中午 12 点之前,你可以使用该房间,并且可以使用酒店的健身房。

这就是授权阶段,酒店给你下发了一张房卡,允许你在限定时间内使用酒店的某些资源。

网站登录的例子

再举一个开发相关的例子。

比如你在使用一个购物网站,想查看自己的订单信息,网站首先要求你输入正确的用户名和密码进行登录。

这就是 认证阶段,获取并验证你的用户 ID。

登录成功后,网站后端会创建一个唯一的会话 ID(Session ID),并通过 Set-Cookie 响应头将这个会话 ID 发送给浏览器。

在此之后的请求中,浏览器会在请求头包含这个会话 ID,网站后端通过这个会话 ID 来识别你的用户 ID,然后去数据库查询属于你的订单信息。

这就是授权阶段,确保你只能查看自己的订单信息。