HTTP Basic Authentication
- 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个ajax异步请求
- 服务器向客户端发送验证请求代码401
- 符合http1.0或1.1规范的客户端收到401返回值时,将自动弹出一个登录窗口,要求用户输入信息,一般为用户名和密码(注意:此时第一步的请求状态为peding)
- 用户输入信息后,将信息以BASE64加密方式加密,并将密文放入前一条请求信息中,新增:Authorization: Basic XXXXX(浏览器默认加密)
- 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的信息与数据库信息进行比较验证,如果正确,根据请求,返回对应的请求资源
- 弊端:加密方式简单,加密可逆,请求头中附带加密信息,安全性较差,一般用于内网
session-cookie
- 服务器在接受客户端首次访问时在服务器端创建seesion,然后保存seesion,为session生成一个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串
- 签名。这一步只是对sid进行加密处理,服务端会根据这个密钥进行解密
- 浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求的请求头中会带上该域名下的cookie信息
- 弊端:服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法;不同客户端需要创建不同的seesion,session保存在服务器内存中,服务器内存消耗大;且基于cookie识别用户,易受到CSRF(跨站伪造攻击:攻击者通过伪造用户的浏览器的请求,向访问一个用户自己曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。常用于盗取账号、转账、发送虚假消息等)攻击;不同服务器之间存在session共享问题
Token
- 令牌,用户首次登陆后,服务器生成一个token返给客户端,客户端在之后的请求中带上token请求数据即可
- 流程:
- 客户端使用用户名密码登录
- 服务器收到请求,验证用户名与密码
- 验证成功,服务器签发一个token给客户端
- 客户端收到token后,存储起来,一般放在cookie或localstorage里
- 客户端之后的请求需要携带签发的token
- 服务器收到请求,验证token,验证成功,返回对应的请求数据,验证失败,返回401鉴权失败
- JWT(JSON Web Tokens):
- 服务器认证以后,生成一个 JSON 对象,发回给用户.之后用户与服务器通信的时候.服务器完全只靠这个对象认定用户身份
- 为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。
- jwt最大的特点就是: 服务器不保存任何 session 数据,从而比较容易实现扩展
- 数据结构:一个很长的字符串,中间用点(.)分隔成三个部分,即Header(头部).Payload(负载).Signature(签名)
- Header: 一个 JSON 对象,描述 JWT 的元数据,例如:{ “alg”: “HS256”,”typ”: “JWT”}.alg属性表示签名的算法.默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
- 头部的 JSON 对象使用 Base64URL 算法转成字符串
- Payload: 部分也是一个 JSON 对象,用来存放实际需要传递的数据。这个 JSON 对象也要使用 Base64URL 算法转成字符串。(注意: JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。)
- Signature: 部分是对前两部分的签名,防止数据篡改。 需要指定一个只有服务器知道的密钥(secret),再使用 Header 里面指定的签名算法(默认是 HMAC SHA256)进行处理
- JWT一旦签发了,不再受服务端控制,在服务端没有记录,是无状态的,是它最大的优点也是最大的缺点
- 单点登录SSO:
- 用户只需要登录一次就可以访问所有相互信任的应用系统
- SSO一般都需要一个独立的认证中心(passport),子系统的登录均得通过passport,子系统本身将不参与登录操作,当一个系统成功登录以后,passport将会颁发一个令牌给各个子系统,子系统可以拿着令牌会获取各自的受保护资源
- 不需要建立session会话,解决了session扩展性问题
- 弊端:token比session的sid大,消耗更多流量,相对需要挤占更多带宽;相对而言,token验证需要花费更多时间和性能,Token相比于session-cookie来说就是一个”时间换空间”的方案
OAuth(开放授权)
- 一种授权机制,开放标准:数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
- 流程:
- 第三方项用户请求授权
- 返回用户凭证
- 请求授权服务器授权
- 授权服务器同意授权后,返回一个资源访问的凭证
- 三方应用通过第四步的凭证向资源服务器请求相关资源
- 资源服务器验证凭证通过后,将第三方应用请求的资源返回
- 1.0与2.0的区别
- 授权方式不同,互不兼容
- 1.0:
- 客户端到授权服务器请求一个授权令牌
- 引导用户到授权服务器请求授权
- 用访问令牌到授权服务器换取访问令牌
- 用访问令牌去访问得到授权的资源
- 2.0
- 用户到授权服务器,请求授权,然后返回授权码
- 客户端由授权码到授权服务器换取访问令牌
- 用访问令牌去访问得到授权的资源
- 1.0:
- 1.0协议每个token都有一个加密,2.0则不需要,但2.0要求使用https协议
- 2.0充分考虑了客户端的各种子态,因而提供了多种途径获取访问令牌
- 授权码:微信OAuth2.0
- 简化模式:QQ第三方登录
- 密码模式
- 客户端模式
- 授权方式不同,互不兼容