认证和授权的区别与联系
原创
认证(Authentication,缩写为 AuthN) 和 授权(Authorization,缩写为 AuthZ) 是两不同的概念,但是很多人经常把它俩混为一谈,我们首先来明确一下二者的区别和联系。
认证 是为了证明「你是谁」。比如说:
- 用户名和密码:你输入正确的用户名和密码,系统就认为你是该用户名的所有者。
- 手机验证码:你输入正确的手机验证码,系统就认为你是该手机号的持有者。
- 身份证/护照:出示身份证件,系统就认为你是该身份证件的持有者。
授权 是认证完成后的一个流程,为了确认「你能做什么」。比如:
- 文件系统:在操作系统中,普通用户只能读取某个系统文件,但不能修改或删除它。只有管理员才有修改的权限。
- 网站系统:在一个论坛里,普通用户可以修改自己的帖子,而管理员可以删除修改任何人的帖子。
另外,我们在工作中也会听到鉴权(Auth)这个词,它是一个宽泛的概念,一般指整个权限控制的过程,即认证 + 授权的组合动作。
总结来说,认证阶段获取用户的唯一标识,授权阶段通过唯一标识确认用户权限。下面用两个实际的例子来辅助理解一下。
酒店入住的例子
先用一个生活中的例子来类比,比方说你预定了一家酒店,现在正在前台办理入住手续。
那么前台首先会让你出示身份证件,并进行人脸验证。
这就是认证阶段,获取并验证你的身份 ID。
前台确认你的真实身份后,会通过身份证号查询你的预订信息,然后给你一张房卡,告诉你:
你的房间号是 209,在明天中午 12 点之前,你可以使用该房间,并且可以使用酒店的健身房。
这就是授权阶段,酒店给你下发了一张房卡,允许你在限定时间内使用酒店的某些资源。
网站登录的例子
再举一个开发相关的例子。
比如你在使用一个购物网站,想查看自己的订单信息,网站首先要求你输入正确的用户名和密码进行登录。
这就是 认证阶段,获取并验证你的用户 ID。
登录成功后,网站后端会创建一个唯一的会话 ID(Session ID),并通过 Set-Cookie 响应头将这个会话 ID 发送给浏览器。
在此之后的请求中,浏览器会在请求头包含这个会话 ID,网站后端通过这个会话 ID 来识别你的用户 ID,然后去数据库查询属于你的订单信息。
这就是授权阶段,确保你只能查看自己的订单信息。