认证和授权
Authentication:认证 验证当前身份,证明你是你自己,指纹打卡。用户名密码登录,手机验证码,邮箱验证等 Authorization:授权 用户授权第三方应用访问该用户资源权限 相册,地理位置权限,微信小程序昵称头像地区性别等
凭证credentials
实现认证和授权的前提需要的媒介(证书)标记访问者身份 如身份证,token令牌
cookie
- http是无状态协议。不会保存任何会话信息,每个请求独立。必须维护一个状态告知服务器来自同一个浏览器。状态通过cookiesession实现
- cookie存储在客户端。服务器发送到用户浏览器本地数据,下次向统一服务器发起请求会被携带并发送。
- cookie不跨域。单一域名,一二级域名允许共享
- 属性:
- name=value: 名称和对应值,字符串类型
- domain: 所属域名
- path: 哪个路径生效
- maxAge: 失效时间,秒。0:删除。负数临时cookie
- expires: 过期时间
- secure:安全协议传输,https,ssl。默认false
- httpOnly:设置了js无法读取cookie。
- 示例:dc_session_id=10_1655022574784.935662; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Session
基于cookie实现,记录服务器和客户端会话状态机制,session存储在服务器端,sessionId存储在客户端cookie中。
- 第一次请求,服务器根据用户提交信息创建对应session。
- 返回session唯一标识信息SessionId给浏览器,存到cookie,记录属于哪个域名。
- 第二次访问,请求自动判断此域名是否存在Cookie信息,如有发给服务器,获取SessionID,查找对应session信息,找到session证明已登录执行后续。没有则用户没登录或者登录失效。sessionId是cookie和session的一道桥梁。
cookie和session区别
- 后者安全,是存储在服务器,前者客服端
- 存储值类型,前者只支持字符串,后者任意
- 有效期前者长,后者短:客户端关闭,Session超时都会失效。
- 存储大小不同:单个cookie不超过4k,后者大,访问量多会占用过多服务器资源
Token 令牌
Access Token
- 访问资源api凭证
- 组成:uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token 的前几位以哈希算法压缩成的一定长度的十六进制字符串)
- 服务端无状态变化,可扩展性好
- 支持移动端
- 安全
- 支持跨程序调用
- 流程:客服端登录,名和密码发到服务端,验证签发token给客服端。收到存储放cookie或local Storage。以后每次请求带上token。服务端收到验证成功返回数据。
- 优点:token需放到header里。服务端不用存放token,解析时间换session存储空间,从而减轻服务器压力,减少查数据库。token由应用管理可避开同源策略
refresh Tooken
用于刷新Access Token.避免用户输入用户名密码。
Access Token有效期短,可用refresh token获取新的。存储在数据库,,只有申请新的access token时才会验证不需要像session保存在内存以应对大量请求。
JWT
JSON Web Token 跨域认证解决方案。认证授权机制。为了网络应用环境间传递声明而执行的一种基于JSON的开放标准。身份提供者和服务提供者间传递被认证用户身份信息,从而获取资源。如用户登录。用 HMAC 算法或者是 RSA 的公/私秘钥对 JWT 进行签名。 教程: www.ruanyifeng.com/blog/2018/0…
jwt.io/ www.jsonwebtoken.io/
-
JWT 认证流程:
- 用户输入用户名/密码登录,服务端认证成功后,会返回给客户端一个 JWT
- 客户端将 token 保存到本地(通常使用 localstorage,也可以使用 cookie)
- 当用户希望访问一个受保护的路由或者资源的时候,需要请求头的 Authorization 字段中使用Bearer 模式添加 JWT,其内容看起来是下面这样
Authorization: Bearer <token>
- 服务端的保护路由将会检查请求头 Authorization 中的 JWT 信息,如果合法,则允许用户的行为
- 因为 JWT 是自包含的(内部包含了一些会话信息),因此减少了需要查询数据库的需要
- 因为 JWT 并不使用 Cookie 的,所以你可以使用任何域名提供你的 API 服务而不需要担心跨域资源共享问题(CORS)
- 因为用户的状态不再存储在服务端的内存中,所以这是一种无状态的认证机制
JWT 的使用方式
- 客户端收到服务器返回的 JWT,可以储存在 Cookie 里面,也可以储存在 localStorage。