Auth权限
分为Authentication登录权限和Authorization权限。前者我们登录时的用户密码,错误时错误码是401,后者是权限,比如一些管理员才能操作的权限,权限不足报403,对应的描述是forbidden。
由于http是无状态的,即我们在第一次请求中登录,第二次请求时并不能够知道我们是登录过的,即第二次请求如何确保是第一次请求的客户端发起的呢?目前主要有两种方式。
session认证
session是存在server端的key,value的存储结构,第一次请求登录,session会在内存中记录一个sid和对应的value,value记录了用户的信息,然后将sid返回给用户端,用户端之后请求时就会将sid带上,然后服务端就会根据sid到session当中找,之后便能找到用户的信息。此时的关键之处便是在于我们的cookie不能被别人获取,因为我们的cookie当中记录了session 的sid。
然而,由于session是记录于服务端的,这就导致使用集群分布式的时候,由于使用不同的服务器,在其他server上没有sid便会出401,这时候需要另外想办法来处理,比如使用共享server来记录session等等。
Authorization
是一种http header 有具体的格式要求 ,格式为 type xxxx 即类型空格内容。
type分为两种,一种是Basic,另外一种是 Bearer。
Basic
basic会在每次请求的时候将用户名与密码,使用base64编码后发送一次。此时服务端当发现是basic的时候就会对内容进行解码然后用:分隔用户名与密码,之后到数据库当中认证。因为我们每次请求都在https上,比较正规,不会被抓包。由于每次请求都会带着用户名和密码,也不用担心分布式部署到多个服务器时出现问题。缺点就是每次都要访问数据库,效率比较低。
Bearer
bearer后面接的是token,token就是一个令牌。比如在用户登录时用户名密码认证完成,服务端通过将用户信息和一段服务端知道的文本采用对称加密算法加密后发送给客户端,客户端在下一次请求时将token带着,服务器端就会对token进行解密。token不需要对数据库进行查询,依赖于加密算法不被攻破作认证。