认证 && 授权&&凭证 ?
认证(Authentication)
验证用户的身份信息,基于信息校验核对,用户登陆过程就是认证过程(如生活中的指纹打卡等,)常见认证方式有
- 用户密码校验
- 邮箱发送登陆链接
- 手机号接收验证码
授权(Authorization)
用户授予第三方应用访问改用户某些资源的权限(如微信小程序询问授权,安装应用时询问是否授予权限)常见方式有
- cookie,session,token,OAuth
凭证(Credentials)
一种媒介来标识访问者的身份,身份标识
- 如在互联网应用中,一般网站或者应用,会有两种模式,游客模式,和登陆模式。对于不同的模式,所开放的功能有限制。
cookie
服务器委托浏览器存储的一些数据,它让服务器有了记忆能力,会再浏览器下次请求时携带并发送到服务器上
特点
- 存储在客户端
- 不可以跨域
- 存储容量4kb
- 数据格式:字符串
属性
- name=value:键值对格式
- domain:指定cookie所属的域名,默认是当前域名
- path:指定cookie在哪一个路径下生效,默认是'/'
- maxAge: cookie失效时间,-1 表示临时cookie,关闭浏览器立即失效,0 表示删除cookie
- expires:过期时间,时间戳,尼格林治时间
- HttpOnly: Cookie只能通过浏览器Http协议传输,禁止其它方式访问,比如JS访问Cookie,减少XSS攻击
- SameSite:可以防范XSRF(跨站请求伪造)攻击,可以设置Strict严格限定不能随着跳转链接跨站发送,设置Lax则略宽松一点允许get/Head方法携带,post方式禁止
- Secure: 只允许https协议加密传输
Session
记录客户端和服务端会话状态的机制,是基于cookie实现的,session存储在服务端,sessionId会存储到客户端的cookie中
Session认证特点
- 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的Session
- 请求返回时将Session的唯一标识信息SessionId返回给浏览器
- 浏览器将此信息存到cookie中
- 第二次访问携带上sessionId
[注]:SessionId是cookie和Session的一道桥梁
token
什么是token?
1、Token的引入:Token是在客户端频繁向服务端请求数据,服务端频繁的去数据库查询用户名和密码并进行对比,判断用户名和密码正确与否,并作出相应提示,在这样的背景下,Token便应运而生。
2、Token的定义:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
3、使用Token的目的:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
和Session的优势比较
- Session:每一次用户经过应用认证之后,应用都要在服务端做一次记录,以方便用户下一次请求鉴别.存储内存开销大
- 扩展性:认证记录保存在内存,意味用户下次请求还要必须要请求在这台服务器上。
token的组成
uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
token流程
- 客户端使用用户名跟密码请求登录
- 服务端收到请求,去验证用户名与密码
- 验证成功后,服务端会签发一个 token 并把这个 token 发送给客户端
- 客户端收到 token 以后,会把它存储起来,比如放在 cookie 里或者 localStorage 里
- 客户端每次向服务端请求资源的时候需要带着服务端签发的 token
- 服务端收到请求,然后去验证客户端请求里面带着的 token ,如果验证成功,就向客户端返回请求的数据
【注】:在每一次请求都需要携带token,需要把token放在Http的Header里,token完全由应用管理避开了同源策略