HTTP Auth


参考资源

  • free-coder:【web】权限认证的常见方式
    https://www.bilibili.com/video/av74292592?from=search&seid=16832319085872437451

  • free-coder:cookie/session/localstorage/sessionstorage web中的k-v存储们有什么区别?
    https://www.bilibili.com/video/av60633692


关于 HTTP Auth

  • authentication 登录; 如 401 错误
  • authorization 权限;如 402 错误,权限不足。

HTTP 是无状态的,无法确认现在的请求,是否是用户之前发起过的;所以有以下认证方式


1、session

是存储在 server 端,以 key-value 结构存储到内存中;

http 第一次请求进行登录,服务端会记录 session ID,包含用户端元数据信息(账号、密码,uuid 等),并将 session ID 返回给客户端。

下一次请求,客户端会将 session ID 放到 cookie 中,传给服务端;服务端会拿 session ID 去查找是否存在对应的 用户元数据信息。


缺点:

cookie 不能被其他人获取到。

session 默认存在当前服务器;如果是使用 ngix 分布式处理,比如代理了三台服务器,机器A和B 不一定都存了用户session。对应的解决方案是,ngix 可以配置基于客户端 IP 哈希的负载均衡方案;或者将 session 存到共享的 server 上,如 radius 上。


2、authorization 的 http header

形式就是 type_xxx,对应的是 authorization 的具体内容;内容含以下有两种形式

2.1 Basic 形式

对用户的 username 和 password 进行 base64 编码。

服务端收到请求后,对header 中的 authorization 字段进行解析。如果发现是 Basic 类型,则将内容进行base64 解码;然后将账号密码以: 分割获取。

一般用 https 请求,不用担心被抓包截获。

比较高效。


缺点:每次都穿 username 和 password,导致服务器每次都要访问一次数据库再进行一次用户认证,导致性能差一点。


2.2 Bearer 类型 (token)

内容接的是一个 token(令牌)

token 生成的方式有很多种。

举个栗子,将用户的 uid 、服务器指定的key 等信息拼成字符串,然后进行AES 加密。服务端将密文发给客户端,客户端下一次请求时,将 token 放到 authorization 的 header 中传给服务端。服务收到后进行解密校验。

没有太大的数据库压力,比较流行。比较有代表性的是 json web token。

发布了14 篇原创文章 · 获赞 1 · 访问量 971

猜你喜欢

转载自blog.csdn.net/weixin_45390999/article/details/103214756