浅谈node使用jwt生成的token应该存在哪里

答:通常存储在客户端里。

jwt 即 JSON Web Token,是一种认证协议,一般用来校验请求的身份信息和身份权限。

早上逛某乎的时候,遇到一位同学在问这个问题,很好奇jwt的存储位置。刚好前段时间在学习此内容,不请自邀,厚颜强答。
最开始我也很好奇这个token怎么保存,还差点想搞个redis存储这个token。

后来查阅资料才知道,原来这个token,服务端是可以不保存的。只需要客户端保存好就行,无论什么保持方式,甚至你让用户写纸条揣兜里都可以!

那这个token是怎么工作的呢?

先来说说需要服务端存储的操作,即传统的session会话的做法。

首先要做用户登陆,先要在服务端维护一个登陆表,这个登陆表可以放在缓存里,也可以放进数据库里。
当用户登陆的时候,把用户信息写入这个登陆表,然后导出一个登陆id,也就是所谓的session,把这个session返回给客户的,让客户端下次请求把这个信息带上来。

对于前端的小伙伴来说,这个过程通常无感知,后端的老哥们使用一个叫set-cookie的http头字段,自己把数据写入浏览器cookie里了。然后请求的时候,浏览器又会自己把cookie写进请求头里面。

当客户端请求进入服务端时,服务端拿到cookie里面的session,然后到登陆表里面去查用户信息,校验用户权限,然后即可完成正常的业务交互。

诶,那现在我因为各种乱七八糟的原因,不想维护一个登录表了,想想要怎么搞?
简单呀,直接把用户信息发给客户端,让客户端每次把用户信息都带过来,这样请求一进来,连表都不用查,直接就知道是哪个用户在请求。

但是这样子,用户的信息都曝光了,那些中间人呀,最喜欢这种耿直请求了,他们直接拿个凳子坐在你服务器端口,坐个几天,你数据库里的全家老表就被别人扒个清清楚楚。

这样肯定不行,那怎么办?

加个密再混个淆呗,这样老哥们拿到你的token,一时半会也一脸懵逼,大概率会大大咧咧地走了,只留下少部分有备(KPI)而来的老哥在苦苦寻求破解。

而你在服务端一解密,你就拿到用户信息了,同样的,你把过期时间也写进密文里面,遇到过期就401跳登录页。这样,一个不需要后端存储登录凭证的方案就出炉咯。

这就是jwt最基本的工作原理:就是把身份信息交给客户端保管。

jwt生成的token由header、payload、signature三部分组成,这三个部分用小数点“.”分隔开。

header,也就是头部信息,是描述这个token基本信息,是一个json格式:

{
    "alg":"HS256",
    "typ":"JWT"
}

alg代表的是后面signature签名部分的生成加密算法,typ表示该token是jwt类型。

payload,就是你的那些用户数据啦,也是一个json格式。不过jwt不建议将敏感数据放进里面,因为规范里,payload和header一样,仅仅只是做一次base64编码后显示在token上。

signature,是这个token的签名,通常情况下是将前面的header和payload加上一个你自己定义的私钥字符串一起加密生成的字符串。

因为前面说了,jwt仅仅是将payload的内容做一次base64编码,所以那些攻击者老哥要改你的内容还是很简单的,但是老哥们不知道你的私钥啊,改了之后没法生成正确的签名,用加密的方式再次对请求进来的header.payload进行校验,发现跟signature对不上,这时候你就可以很清楚知道,有人在搞事情,直接返回个500假装服务器挂了。
如果想更安全,建议全程使用https协议进行请求通信。

当然,你已经了解了这个工作原理,自己搞一套恶心人的规范,也不是不行,比如,把payload再加一次密然后gzip下等等。

那,采用jwt的好处都有啥?

第一点,自然是服务端不需要维护一个登陆表了,节省空间,特别是用户多的情况。
第二点,拓展简单,前提是你不搞事情,老老实实遵守采用json格式去表述你的内容。
第三点,无状态,只要服务端支持解析,就可以开展业务,不需要专门搞个机制去共享session,方便加机子。
第四点,支持各种各样的客户端,不支持cookie也能玩。
坏处嘛,自然就是每次请求都要把这些数据带来带去的,肯定是增加了请求内容的。而且,每次请求进来你都要去校验,去拿header和paylaod加一次密与signature校验,也会增加请求的处理时间。这个与传统操作相比,其实是一个时间与空间之间的权衡问题,最后,还是看你选择咯。

到此这篇关于浅谈node使用jwt生成的token应该存在哪里的文章就介绍到这了,更多相关jwt生成的token存哪里内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • laravel5.5安装jwt-auth 生成token令牌的示例

    1:首先通过composer进行安装 composer require tymon/jwt-auth 2:添加服务提供者 编辑 config/app.php,在 "providers" 添加: 'Tymon\JWTAuth\Providers\JWTAuthServiceProvider', 3:添加 Facades 编辑 config/app.php,在 "alias" 添加: 'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTA

  • SpringBoot集成JWT生成token及校验方法过程解析

    GitHub源码地址:https://github.com/zeng-xian-guo/springboot_jwt_token.git 封装JTW生成token和校验方法 public class JwtTokenUtil { //公用密钥-保存在服务端,客户端是不会知道密钥的,以防被攻击 public static String SECRET = "ThisIsASecret"; //生成Troke public static String createToken(String u

  • Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过:解密失败说明Token无效或者已过期. 流程图如下: 一.用户发起登录请求 二.服务端创建一个加密后的JWT信息,作为Token返回 1.用户登录之后把生成的Token返回给前端 @Authorization @ResponseBody @GetMappin

  • 浅谈node使用jwt生成的token应该存在哪里

    答:通常存储在客户端里. jwt 即 JSON Web Token,是一种认证协议,一般用来校验请求的身份信息和身份权限. 早上逛某乎的时候,遇到一位同学在问这个问题,很好奇jwt的存储位置.刚好前段时间在学习此内容,不请自邀,厚颜强答. 最开始我也很好奇这个token怎么保存,还差点想搞个redis存储这个token. 后来查阅资料才知道,原来这个token,服务端是可以不保存的.只需要客户端保存好就行,无论什么保持方式,甚至你让用户写纸条揣兜里都可以! 那这个token是怎么工作的呢? 先来

  • 浅谈Node的内存泄露

    目录 1.node内存相关知识 2.哪些情况会造成内存泄露 第一.全局变量 第二.函数闭包 第三.事件监听 3.内存泄露的监测 4.Chrome DevTools进行分析和对比 5.内存分析的意义 1.node内存相关知识 无论是运行在浏览器端的js,还是运行在node中的js,关于内存管理的方案,都是通过垃圾回收机制来实现内存的分配和释放.当我们的代码编写有缺陷时,可能就无法通过gc来释放内存,这个时候,我们就造成了内存泄露. Node.js进程的内存管理,都是由 V8 引擎自动处理的,包括内

  • 浅谈Node.js ORM框架Sequlize之表间关系

    Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系.基于模型关系可以实现关联表之间的连接查询.更新.删除等操作.本文将通过一个示例,介绍模型的定义,创建模型关联关系,模型与关联关系同步数据库,及关系模型的增.删.改.查操作. 数据库中的表之间存在一定的关联关系,表之间的关系基于主/外键进行关联.创建约束等.关系表中的数据分为1对1(1:1).1对多(1:M).多对多(N:M)三种关联关系. 在Sequelize中建立关联关系,通过调用模型(源模型)的belon

  • 浅谈Android Studio JNI生成so库

    1.新建Android studio工程 2.新建class:AppKey.java.主要为了保存密钥 代码块 package com...adminapp.lib.utils.jni; /** * Created by seven on 16/9/8. */ public class AppKey { static { System.loadLibrary("AppKey"); } public static native String WechatId(); public stat

  • 浅谈node.js中间件有哪些类型

    概述 node中间件就是封装在程序中处理http请求的功能.node中间件是在管道中执行.中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯. 中间件为主要的逻辑业务所服务,可分为:应用级中间件.路由级中间件.内置中间件.第三方中间件.错误级中间件. 1.应用级中间件 每一个中间件就是调用一个函数,需要配合其他的中间件或者路由使用 server (函数) 拦截所有的路由 server.use('/reg',函数):拦截特定的路由 const express=require('ex

  • 浅谈node node-sass sass-loader版本对应问题

    目录 node版本不对应,升级node或者降级 使用nvm对node版本进行管理和切换 node-sass版本不匹配 查看node-sass和sass-loader版本是否对应 查看node-sass和node版本是否对应 node -v 具体对应版本如下图: 图片来自https://github.com/sass/node-sass node版本不对应,升级node或者降级 使用nvm对node版本进行管理和切换 安装 nvm-window https://github.com/coreybu

  • 浅谈Node.js轻量级Web框架Express4.x使用指南

    Express是一个轻量级的Web框架,简单.灵活 也是目前最流行的基于Nodejs的Web框架 通过它我们可以快速搭建功能完整的网站 (express 英文意思:特快列车) Express现在是4.x版本,更新很快,并且不兼容旧版本,导致现在市面上很多优秀的Node书籍过时 这篇文章是一篇入门级的Express使用,需要一定Node.js的基础 Web应用创建 首先要做的是下载express并引用 npm install express --save 全局安装就+个-g 引用express v

  • 浅谈node中的cluster集群

    结论 虽然平常通过设置为CPU进程数的工作进程,但是可以超过这个数,并且并不是主进程先创建 if (cluster.isMaster) { // 循环 fork 任务 CPU i5-7300HQ 四核四进程 for (let i = 0; i < 6; i++) { cluster.fork() } console.log(chalk.green(`主进程运行在${process.pid}`)) } else { app.listen(1314) // export app 一个 Koa 服务器

  • 浅谈Node异步编程的机制

    本文介绍了Node异步编程,分享给大家,具体如下: 目前的异步编程主要解决方案有: 事件发布/订阅模式 Promise/Deferred模式 流程控制库 事件发布/订阅模式 Node自身提供了events模块,可以轻松实现事件的发布/订阅 //订阅 emmiter.on("event1",function(message){ console.log(message); }) //发布 emmiter.emit("event1","I am mesaage!

  • 浅谈Node模块系统及其模式

    模块是构建应用程序的基础,也使得函数和变量私有化,不直接对外暴露出来,接下来我们就要介绍Node的模块化系统和它最常用的模式 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统. 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的.换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码.JSON 或者编译过的C/C++ 扩展. module的本质 我们都知道,JavaScript有一个很大的缺陷就是缺少namespa

随机推荐