cookie、session和jwt

概要

cookie

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

session

1. session是什么session

session本质是一段保存在服务端内存中的代码片断,session的实现通常是基于cookie的。cookie记录凭证,session记录具体数据。架构

2. session存在问题分布式

  • session会占用内存,开销大。传统的session保存在内存里,每当用户登陆时,在session作一次记录。随着认证用户的增多,服务端的开销会明显增大。
  • session横向扩展差。页面的请求不必定是同一台服务器,若是请求打到不一样服务器,那么服务器之间须要共享session。此时须要作session的持久化,若是持久化失败就出现认证失败。

jwt

jwt全称json web token,是目前最流行的跨域身份验证解决方案。

1. 解决的问题

传统的session不支持分布式架构,没法支持横向扩展,只能经过数据库来保存会话数据实现共享。若是持久层失败会出现认证失败。回到问题的本质,是由于服务端须要记录客户端对应的信息,来鉴别客户端状态。

而使用jwt,服务端不须要记录客户端对应的信息。服务端经过对token上携带的信息进行处理可以确认这个token是不是有效。服务器变为无状态,使其更容易扩展。

2. token的组成

jwt生成的token由3部分组成:头、内容、签名,经过符号`.`链接。

1. Header 头部

  • 声明类型,这里是JWT
  • 声明加密的算法,这里是HS256

Header的示例:

{
  'typ': 'JWT',
  'alg': 'HS256'
}复制代码

2. Payload 内容:存放有效信息,例如过时时间,面向用户等

Payload的示例:

{
  "exp": "1234567890",
  "name": "John Doe"
}复制代码

3. Signature 签名

Signature 由下面两步获得

  1. 将base64加密后的Header和base64加密后的Payload使用.链接组成的字符串

  2. 将字符串进行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能让服务器变成无状态的,即服务器不需保存当前请求的会话信息。实现原理是:

  • 在初次请求时,服务端生成一个token返回给客户端;
  • 客户端再次请求时携带token,服务端将token拆解成header+payload+signature三部分,将header.payload进行加密,获得新的signature。若是新的signature和旧的signature相等则表示经过,当前客户端是登陆过的状态。
相关文章
相关标签/搜索