鉴权学习笔记

鉴权概念及目的

一般来说,一个网站不可能只有一个操作权限。如,可能存在未登录的操作权限,登录的操作权限,以及管理员的操作权限。网站鉴权的目的就是用户在进行操作前,对用户的身份进行识别并判断是否具有该操作权限的过程。
鉴权是非常普遍且重要的一个内容,通俗一点的理解就是登陆账号,通过登陆建立与服务器的“信任”,然后就可以赋予客户端操作的权限。

常用的鉴权有四种

1. HTTP Basic Authentication
2. Session-Cookie
3. Token验证
4. OAuth(开放授权)

基本验证 HTTP Basic Authentication

这种授权方式是浏览器遵守HTTP协议实现的基本授权方式。HTTP协议定义了基本认证,认证允许HTTP服务器对客户端进行用户身份验证的方法。
认证过程大致如下:

1.客户端向服务器请求数据,假设客户端尚未被验证;
2.服务器向客户端发送验证请求代码401,服务器返回的数据包含:WWW-Authenticate: Basic realm=”xxx”
3.当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
4.用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息包含如下内容:Authorization:
Basic d2FuZzp3YW5n(注:d2FuZzp3YW5n表示加密后的用户名及密码)
5.服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端。
由于base64编码本身是可逆的过程,所以如果有中间人截获报文后,通过重放攻击即可获取正确授权。基本认证这种方式适合于弱认证要求的场景。

Session-Cookie

这个方式是利用服务器端的session(会话)和浏览器端的cookie来实现前后端的认证。
认证步骤大致如下:
1.服务器在接受客户端首次访问时在服务器端创建seesion,然后保存seesion(我们可以将seesion保存在内存中,也可以保存在redis中,推荐使用后者),然后给这个session生成一个唯一的标识字符串,然后在响应头中种下这个唯一标识字符串。
2.签名。这一步只是对sid进行加密处理,服务端会根据这个secret密钥进行解密。(非必需步骤)
3.浏览器中收到请求响应的时候会解析响应头,然后将sid保存在本地cookie中,浏览器在下次http请求de 请求头中会带上该域名下的cookie信息,
4.服务器在接受客户端请求时会去解析请求头cookie中的sid,然后根据这个sid去找服务器端保存的该客户端的session,然后判断该请求是否合法。

Token验证

使用基于 Token 的身份验证方法,大概的流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据。
    客户端在首次登陆以后,服务端再次接收http请求的时候,就只认token了,请求只要每次把token带上就行了,服务器端会拦截所有的请求,然后校验token的合法性,合法就放行,不合法就返回401(鉴权失败)。

开放授权验证 Oauth Authentication

OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容,为了保护用户数据的安全和隐私,第三方网站访问用户数据前都需要显式的向用户征求授权。我们常见的提供OAuth认证服务的厂商有支付宝,QQ,微信。

Session-Cookie验证方式和Token验证方式的区别

  1. sessionid 他只是一个唯一标识的字符串,服务端是根据这个字符串,来查询在服务器端保持的seesion,这里面才保存着用户的登陆状态。但是token本身就是一种登陆成功凭证,他是在登陆成功后根据某种规则生成的一种信息凭证,他里面本身就保存着用户的登陆状态。服务器端只需要根据定义的规则校验这个token是否合法就行。
  2. cookie-session机制他限制了客户端的类型,而token验证机制丰富了客户端类型。session-cookie是需要cookie配合的,居然要cookie,那么在http代理客户端的选择上就是只有浏览器了。但是我们知道http代理客户端不只有浏览器,还有原生APP等等,这个时候cookie是不起作用的,但是token 就不一样,他是登陆请求在登陆成功后再请求响应体中返回的信息,客户端在收到响应的时候,可以把他存在本地的cookie,storage,或者内存中,然后再下一次请求的请求头重带上这个token就行了。
  3. 时效性。session-cookie的sessionid实在登陆的时候生成的而且在登出事时一直不变的,在一定程度上安全就会低,而token是可以在一段时间内动态改变的。
  4. 可扩展性。token验证本身是比较灵活的,一是token的解决方案有许多,常用的是JWT(Json Web Token)。

猜你喜欢

转载自blog.csdn.net/daisy2001daisy/article/details/106031550
今日推荐