前(后)端鉴权方式
Posted by Mars . Modified at
一、cookie + session
- 浏览器登录发送账号密码,服务端查用户库,校验用户;
- 服务端把用户登录状态存为 session,生成一个 session_ID;
- 通过登录接口返回,把 sessionID set 到 cookie 上;
- 此后浏览器再请求业务接口,session_ID 随 cookie 带上;
- 服务端查 session_ID 校验 session;
- 成功后正常做业务处理,返回结果。
优点:
- 因为主要信息在服务器存储,客户端只需要存储一个用来标识唯一性的ID,减少了请求携带cookie的体积;
缺点:
- 服务端需要对每个session进行储存,压力大;
- 服务端如果是集群,需要把session用额外独立的库集中储存。
二、token
- 用户登录,服务端校验账号密码,获得用户信息;
- 把用户信息、配置等编码成 token,通过 cookie set 到浏览器;
- 此后用户请求业务接口,通过 cookie 携带 token;
- 接口校验 token 有效性,进行正常业务接口处理。
token与session的区别?
token携带了用户的完整信息,通过服务端密钥编码储存在客户端,服务端不进行储存;而session则主要由服务端保存会话数据;
狭义上,session指代“服务端保存会话信息,客户端用cookie储存会话id”的鉴权形式,而token更为灵活,指代“客户端可以存在任何位置,服务器不保存信息”的鉴权形式;
优点:
- 服务端不保存用户会话信息,避免查库带来的延迟;
- 服务端压力小,不需要设置session统一管理架构,降低成本。
缺点:
- token一般较长,请求携带cookie体积较大;
三、JWT:JSON Web Token
什么是JWT
JWT是Token的一种实现。它和普通Token都是访问资源的令牌。它们的区别是:
普通Token在被服务器收到后,服务器可能需要去查询数据库才能确认用户的身份,而JWT本身就包含加密信息,服务器利用自己的密钥对JWT进行验证,就可以确定用户身份,不需要查询数据库。
校验JWT的网站:JWT校验
JWT组成
Header和Payload
JWT由三部分组成:Header、Payload和Signature。
其中Header中的字段比较固定:
- **typ: ** 类型。值恒定为
'JWT'
; - **alg: ** 签名的加密算法。一般选为
'HS256'
;
Payload的字段可以自由设置。
Header和Payload的原始数据都是JSON格式,通过Base64编码后,放入JWT的前两个部分。
Signature 签名
签名由两部分计算而成:
- A: Header和Payload的Base64编码串,中间用
','
串联; - B: 安全码Secret-Code。可以自由指定,用于对JWT的有效性进行校验。(长度不超过256bit)
加密方式一般选择HS256
,即加密后的字符串为HS256(A, B)
。它将放在JWT的第三部分。
JWT的校验
服务端收到用户的JWT后:通过指定的安全码Secret-Code,对JWT的前两部分进行一次HS256计算即可,结果与第三部分进行比对,如果一致可通过校验。
四、单点登录
1. 什么是单点登录?
假设一个公司拥有多个业务,部署在多个域名下,只要用户在一个业务下完成登录,访问其他业务页面可自动登录,叫做单点登录。
2. 如何实现?
同一域名下的不同子域名,可以使用cookie的domain关键字来实现。
不同域名下,单点登录需要使用独立的认证服务SSO来实现。