1. 为何会出现cookie?web
http是无状态的协议,致使请求不知道是哪一个用户操做的。cookie的出现就是为了解决http请求无状态和服务端要知道请求来源之间的矛盾。算法
cookie会根据服务端发送的响应报文中的set-cookie字段信息,通知客户端保存cookie。下次客户端发送请求时就会携带cookie,服务端收到请求,根据cookie和服务器的记录进行比对,找到以前的状态。数据库
2. cookie存在的问题有哪些?json
cookie会做为http的请求报文进行传递,因此要注意cookie字段的大小,通常小于4kb。若是cookie存储的字段过大,浪费流量,服务端也会耗费性能解析cookie。跨域
cookie保存在客户端,存在篡改或劫持的风险。故cookie不能存储重要信息,通常只保存凭证,服务端会根据cookie从数据库或session中查找具体信息。服务器
关于cookie更详细的介绍能够看维基百科 ➡️ HTTP cookiecookie
1. session是什么session
session本质是一段保存在服务端内存中的代码片断,session的实现通常是基于cookie的。cookie记录凭证,session记录具体数据。架构
2. session存在问题分布式
jwt全称json web token,是目前最流行的跨域身份验证解决方案。
1. 解决的问题
传统的session不支持分布式架构,没法支持横向扩展,只能经过数据库来保存会话数据实现共享。若是持久层失败会出现认证失败。回到问题的本质,是由于服务端须要记录客户端对应的信息,来鉴别客户端状态。
而使用jwt,服务端不须要记录客户端对应的信息。服务端经过对token上携带的信息进行处理可以确认这个token是不是有效。服务器变为无状态,使其更容易扩展。
2. token的组成
jwt生成的token由3部分组成:头、内容、签名,经过符号`.`链接。
1. Header 头部
Header的示例:
{ 'typ': 'JWT', 'alg': 'HS256' }复制代码
2. Payload 内容:存放有效信息,例如过时时间,面向用户等
Payload的示例:
{ "exp": "1234567890", "name": "John Doe" }复制代码
3. Signature 签名
Signature 由下面两步获得
将base64加密后的Header和base64加密后的Payload使用.链接组成的字符串
将字符串进行Header中声明的加密方式进行加盐secret组合加密
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
3. 鉴权原理
① 客户端发送/login请求到服务端A,服务端A校验登陆经过后生成token。
② 服务端A将token返回给客户端。
③ 客户端发送/list请求到服务端B,同时在请求头里携带了token。服务端将token拆解成header+payload+signature三部分,再次将header.payload进行加密,获得新的signature。若是新的signature和旧的signature相等则表示当前客户端是登陆过的状态。
④ 服务端B校验经过,返回数据给客户端。
4. 经常使用的jwt库有
jwt-simple
jsonwebtoken
读完这篇文章,但愿你能对cookie、session和jwt有必定的了解。
传统的cookie+session的鉴权形式有必定的局限性,表如今:
1. session占用服务器内存
2. session的横向扩展性很差,须要数据持久化。数据持久化若是失败影响鉴权。
使用jwt能让服务器变成无状态的,即服务器不需保存当前请求的会话信息。实现原理是: