一、什么是cookie
- HTTP是无状态的协议:每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,无法分辨上一次的请求发送者和这一次请求的发送者是不是同一个客户端。服务器与浏览器为了进行会话跟踪,就必须主动的去维护一个状态,这个状态用于告诉服务端前后两个请求是否来自同一个浏览器。这个状态就需要通过cookie或者session来实现。
- cookie存储在客户端:cookie是服务器发送到用户浏览器,并进行保存到本地的数据,它会在浏览器下次向同一服务器再发起请求时被再一次被带到并发送到服务器上面
- cookie是不可跨域名的:每个cookie都会绑定单一的域名,无法在别的域名下获取使用
二、什么是Session
- session是区别cookie的另一种记录服务器和客户端会话状态的机制
- session是基于cookie实现的,session存储在服务器端,sessionid会被存储到客户端的cookie中
- session认证流程
- 用户第一次请求服务器的时候,服务器根据用户提交的相关信息,创建对应的session
- 服务器响应客户端的请求,并返回唯一标识信息sessionid给浏览器
- 浏览器把返回的sessionid存储到cookie中,同时cookie记录次sessionid属于哪个域名
- 当用户第二次访问服务器的时候,请求自动判断此域名下是否存在cookie信息,如果存在就将cookie信息发送给服务端,服务端会从cookie中获取sessionid,再根据sessionid查找对应的session信息,如果找到session证明用户已经登录,可以执行后面操作,如果没有找到,说明用户没有登录或者失败。
三、cookie和session的区别
- 安全性:session比cookie安全,session是存储在服务器端,cookie是存储在客户端
- 存储值的类型不同:cookie只支持存字符串数据,设置为其它类型的数据,需要将其转换成字符串,session可以存任意数据类型。
- 有效期不同:cookie可设置为长时间保持,session的失效时间比较短,客户端关闭就会失效
- 存储大小不同:单个cookie保持的数据不能超过4KB,Session存储数据高于cookie,当访问量过多,会占用更多的服务器资源。
四、什么是Token(令牌)
Token
- 访问接口(api)时所需要的资源凭证,比如订单接口需要带上登录返回的token值,才能访问订单接口数据
- 常见的token组成:UID(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token+请求数据进行几次md5之后的值)
- token的特点:
- 服务端无状态化、可扩展性好
- 支持移动端设备
- 安全性好
- 支持跨程序调用
- token的身份验证流程:
①、客户端使用用户名和密码,请求登录
②、服务端收到请求,验证用户名和密码
③、验证成功之后,服务端返回一个token,并把这个token发送给客户端
④、客户端收到token之后,会把它存储起来,放入cookie里面
⑤、客户端每次想服务器请求资源的时候,都需要带着这个token
⑥、服务端收到请求的时候,验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求的数据
- 每一次请求都需要携带token,需要把token放到HTTP的请求头里面
- 基于token的用户认证,服务端不用存放token数据。
五、Token和session的区别
- Session是一种记录服务器和客户端会话状态的机制,使服务端有状态化,可以记录会话信息。
- token是一种令牌,访问接口(API)时需要的凭证,也像古代进入到城里需要腰牌一样。token使服务器五状态化,不会存储会话信息。
- token的安全性要好于session,每次请求都有签名,也就会出现每次的token都会变化,也可以防止一定的攻击、
六、什么是JWT
- JSON Web Token(简称JWT)是目前最流行的跨越认证解决方案。
- 是一种认证授权机制
- JMT是在网络应用环境之间传递声明,而执行的一种基于json的开发标准
JWT的认证流程:
- 用户输入用户名/密码登录,服务器认证成功之后,会返回一个JWT给客户端
- 客户端将token保存到本地(通常使用localstorge)
- 当用户访问一个受保护的路由或者资源的时候,需要请求头的Authorization字段中使用Bearer模式添加JWT
- 服务端的保护路由将会检查请求头Authorization中的JWT信息,如果合法,则允许用户的行为
- JWT内部保护了一些会话信息,减少了需要查询数据库的需要
- JWT并不使用cookie,可以使用任何域名提供你的api服务,不需要担心跨域的问题
- 用户的状态不存储在服务端的内存中,是一种无状态的认证机制
七、Token和JWT的区别
相同点:
- 都是访问资源的令牌
- 都可以记录用户的信息
- 都是使服务端无状态化
- 都是只有验证成功后,客户端才能访问服务端上受保护的资源
两者的区别:
- Token:服务端验证收到客户端发送过来的token时,需要查询数据库获取用户信息,验证Token是否有效
- JWT:将Token和请求信息加密后存储在客户端,服务端只需要使用密钥进行校验即可,不需要查询或者减少查询数据库,因为JWT自己包含了用户信息和加密的数据
常见的前后端鉴权方式:
- Session-Cookie
- Token验证(包括JWT,sso)
- Oauth2.0
欢迎来到testingpai.com!
注册 关于