关于鉴权

213 阅读2分钟

关于鉴权

HTTP 无状态协议,即每次请求都是独立的,无法获取上一次请求的状态数据。所以每次用户发出http请求时,都需要带上能识别鉴定权限的标记。

HTTP Basic Authentication: 请求时携带验证信息,该方法安全性能不高,一般用于登录功能。

服务端存储session,客户端存cookie

  1. cookie属性:
    • cookie跟着会话走的,若浏览器窗口关闭,当前session结束,该cookie会被删除掉
    • 支持设置过期时间,通过Max-AgeExpires属性
    • secure: cookiesecure属性指定浏览器只有在加密协议HTTPS下,才会把这个Cookie发送到服务器
    • HttpOnly: cookieHttpOnly指定Cookie无法通过JS脚本获取(Document.cookie属性、XMLHttpRequest对象和Request API都无法获取),只有浏览器发出的Http请求才会自动带上
  2. cookie的读写:
    • 请求返回的头部信息中,Set-Cookie表示向浏览器写入一条cookie,一次Http请求可以返回多个Set-Cookie
    • cookie也可以自己创建、并修改,若服务端返回的Set-Cookie没有带HttpOnly,也支持修改,可通过document.cookie来修改

JWTJSON Web Token)一个开放标准:通过header中传token鉴权方式

  1. token是由服务端在获取用户信息后返回给前端的能唯一识别该用户的标志,前端将token存储起来,在每次调用接口时放在头部传到服务端
  2. 为增加token的安全性,有以下措施:
    • 存储的数据进行base64转码
    • token加签名,通过token信息跟签名 进行加密算法计算出来得到.sig cookie
    • 基于以上,为了规范token格式,引入jwt.io, jwt.io是一种token编码方案。
  3. token优点
    • 减轻服务器压力(服务器不需要保存用户登录信息)
    • 支持跨域访问
    • 性能好:可以直接从token中读到userId,不需要查询登录状态表
  4. OAuth2.0: 用于颁发令牌(token),有4种授权方式
  • 授权码 authorization code(通过code授权码、redirect_uri回调网址,例子可看下企业微信提供的授权API例子
sequenceDiagram
        participant A应用
        participant B应用
        participant A服务端
        A应用->>B应用:请求授权码
        B应用-->>A应用:返回授权码code
        A应用->>A服务端:带着code,请求令牌
        A服务端-->>A应用:返回令牌
  • 隐藏式 implicit (同授权码方式类似,通过跳转到中间网站授权之后返回主页面,不同的是,隐藏式是直接放回token回来,放在url锚点位置)
sequenceDiagram
        participant A应用
        participant B应用
        A应用->>B应用:请求令牌
        B应用-->>A应用:返回令牌
  • 密码式 password(不需要中间页跳转,只需用户给出用户名+密码,服务端在http响应中返回token,该方法风险较大)
  • 客户端凭证 client credentials(针对第三方应用,不是针对用户,即多个用户可共享同一个令牌)
  1. 令牌的更新
    • refresh_token 时效性长,当access_token失效时,通过refresh_token会重新返回新的access_token
    • access_token 时效性短