概念
鉴权:验证用户是否拥有访问系统的权利。
传统的鉴权是通过密码来验证的,这种方式的前提是,每个获得密码的用户都已经被授权。在建立用户时,就为此用户分配一个密码,用户的密码可以由管理员指定,也可以由用户自行申请。这种方式的弱点十分明显:一旦密码被偷或用户遗失密码,情况就会十分麻烦,需要管理员对用户密码进行重新修改,而修改密码之前还要人工验证用户的合法身份。
鉴权方式
HTTP Basic Authentication
HTTP协议实现的基本认证方式,此方式在客户端会弹出一个登录窗口,由用户输入用户名和密码进行登录,安全性不高。
Session-Cookie 认证
利用服务端的 Session(会话)和浏览器(客户端)的 Cookie 来实现的前后端通信认证模式。
当客户端第一次向服务器发送请求,服务器第一次接收到请求时,为此请求开辟一块内存空间(一个Session对象),服务器会为这个Session对象生成一个唯一的标识sessionID,并在HTTP响应头的 Set-Cookie:JSESSIONID=XXXXXXX 中设置这个sessionID(Session的实现依赖Cookie)。
客户端收到服务端的响应后会解析响应头,根据Set-Cookie将sessionID保存在本地Cookie中,当下次向服务器发送请求时,请求头会自动附上该域名下的 Cookie 信息,而服务端接收客户端请求时会去解析请求头 Cookie 中的sessionID,根据sessionID找到Session对象,从而获取用户信息。
这个 sessionID 一经创建,就在后面的每次 http 请求中,都带在请求头当中。服务器就是靠这种标识,来区别客户端是哪一个的。
但是 sessionID 是基于Cookie存储的方式保存,如果Cookie被截获,用户就容易受到跨站请求伪造的攻击,这是不安全的。
Token 验证
Token实际就是在计算机身份验证中的令牌(临时)的意思。当前端向后端发起数据请求的时候,后端需要对前端进行身份验证,但是我们又不想每次都输入用户名和密码,这是就需要一个标识来证明自己的身份,这个标识就是token。
这种验证是在 App 兴起以后发展起来的,因为在 App 里没有浏览器环境,没有Cookie,那么客户端在进行了权限验证以后,就把这个登录凭证,也就是 Token 直接存在了客户端,并且在每次请求服务器的时候都把它带上。最常用的 Token 验证方式,就是 JWT (Json Web Token) ,JWT是通过对带有相关用户信息的json进行加密,加密的方式比较灵活。
基于Token的身份验证流程:
客户端使用用户名和密码请求登录
服务端收到请求,验证登录是否成功
验证成功后,服务端会返回一个Token给客户端,反之,返回身份验证失败的信息
客户端收到Token后把Token用一种方式存储起来 ( cookie / localstorage / sessionstorage /... )
客户端每次发起请求时都会将Token发给服务端
服务端收到请求后,验证Token合法性,合法就返回客户端所需数据,反之,返回验证失败的信息
OAuth 验证
OAuth(开放授权)是一种开放标准,用于允许用户在不暴露其凭据(如用户名和密码)的情况下,让第三方应用程序访问其资源(如用户的照片、视频、联系人列表等)。OAuth 主要用于授权,而不是身份验证。如网站第三方登录,可以使用 QQ 或者微信登录,小程序微信一键登录。
Session、Cookie、Token
HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录,Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
Cookie和Session是两种常见的用于跟踪使用者状态和实现使用者认证的机制。Cookies是一种存储在客户端的数据机制,而Session则是一种在服务器端存储使用者信息的机制。
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,服务器可以利用 Session 存储客户端在同一个会话期间的一些操作记录(用户在浏览网站时,记录用户从进入网站到关闭浏览器所经历的一系列状态和行为)。
Session工作原理:
Cookie工作原理:
Session与Token:作为身份认证,Token安全行比Session好; Session 认证只是简单的把User 信息存储到Session里,因为SID 的不可预测性,暂且认为是安全的,这是一种认证手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是认证和授权,认证是针对用户,授权是针对App ,其目的是让某App有权利访问某用户的信息。
Token与Cookie:Cookie是不允许垮域访问的,但是Token是支持的, 前提是传输的用户认证信息通过HTTP头传输;Token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;Cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用Cookie自动登录用户名。
Cookie与Session区别:Cookie数据存放在客户端上,Session数据放在服务器上;Cookie不是很安全,且保存数据有限;Session一定时间内保存在服务器上,当访问增多,占用服务器性能。
参考:
Session、Cookie、Token 【浅谈三者之间的那点事】
Cookie vs Session:全面对比分析,探讨优点和适用场景