架构安全性设计、部分示例及原理分析

HTTP 协议是一种无状态的传输协议,每一个请求都是完全独立的,所以一般web开发都会采用cookie-session机制让服务器有办法能够区分出发送请求的用户是谁,在服务器中会维护了一些用户的session信息,为了服务器的高可用,会把用户的状态信息存储到Redis等集中式的存储中。 除了cookie-session机制,还可以使用JWT(JSON Web Token)的方案,能够让信息不存储在服务端,且也能防止信息在传输过程中被篡改。

JWT的原理:服务器认证以后,生成JSON 对象,发回给用户。以后,用户与服务端通信的时候,都要发回这个 JSON 对象。服务器完全只靠这个对象认定用户身份。为了防止用户篡改数据,服务器在生成这个对象的时候,会加上签名。 JWT:的数据结构由三部分组成Header(头部)、Payload(负载)、Signature(签名)。写成一行,就是下面的样子:

Header.Payload.Signature

Header 部分是一个 JSON 对象,描述 JWT 的元数据,通常是下面的样子。

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据,可以定义业务需要的私有字段,JWT 规定了7个官方字段,供选用。

iss (issuer):签发人
exp (expiration time):过期时间
sub (subject):主题
aud (audience):受众
nbf (Not Before):生效时间
iat (Issued At):签发时间
jti (JWT ID):编号

Signature 部分是对前两部分的签名,防止数据篡改。需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,其中header和payload部分需要使用Base64URL进行转化。然后三个部分之间用”点”(.)分隔,就可以返回给用户。

最后的效果如下:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwMTIxMiIsIm5hbWUiOiJKb2huIERvZSIsImlhdCI6MTUxNjIzOTAyMn0.RoeGlqmkqtGrgjmV0Z5EF8bwCLQdzRXwPiG1ZmiNVfU

客户端每次与服务器通信,都要带上这个 JWT。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP 请求的头信息Authorization字段里面。

JWT的应用目前感觉还是比较少,但是提供了一种服务端无状态的思路,正常情况下使用cookie-session机制能够满足要求了。

Original: https://www.cnblogs.com/csophys/p/15887898.html
Author: csophys
Title: 架构安全性设计、部分示例及原理分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580000/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 【主流技术】Spring Boot中的微信支付(小程序)

    前言 微信支付是企业级项目中经常使用到的功能,作为后端开发人员,完整地掌握该技术是十分有必要的。 logo 一、申请流程和步骤 图1-1 注册微信支付账号 获取微信小程序APPID…

    Java 2023年6月6日
    0104
  • Java 将HTML转为Word

    本文以Java代码为例介绍如何实现将HTML文件转为Word文档(.docx、.doc)。在实际开发场景中可参考此方法来转换。下面详细方法及步骤。 在编辑代码前,请先在程序中导入S…

    Java 2023年5月29日
    071
  • jQuery常使用的方法

    jQuery常使用的方法 1,jQuery中正则表达式的使用 var reg = /^(([1-9]\d*)|0)$/ ; if (!reg.test(createCost)){ …

    Java 2023年6月5日
    098
  • Qt使用OpenGL进行多线程离屏渲染

    基于 Qt Widgets的 Qt程序,控件的刷新默认状况下都是在UI线程中依次进行的,换言之,各个控件的 QWidget::paintEvent方法会在UI线程中串行地被调用。若…

    Java 2023年5月30日
    080
  • nginx rewrite重写与防盗链配置

    nginx rewrite规则格式:rewrite regex replacement flag flag标记有四种格式: last – 相当于Apache中的Lbreak – 中…

    Java 2023年5月30日
    060
  • Java—多线程入门

    前置知识 什么是进程,什么又是线程?咱不是讲系统,简单说下,知道个大概就好了。 进程:一个可执行文件执行的过程。线程:操作系统能够进行运算调度的 最小单位。它被包含在进程之中,是进…

    Java 2023年6月7日
    060
  • Docker安装容器示例

    1.以mysql为例 ,搜索镜像 2.下载镜像 3.查看已经安装的镜像 4.删除镜像 二、容器操作 软件镜像——运行镜像——产生一个容器(正在运行的软件) 1.运行创建镜像,有了镜…

    Java 2023年6月13日
    064
  • numpy中矩阵的逆,求解,特征值,特征向量

    逆:numpy.linalg.inv() 求矩阵的逆import numpy as npa=np.mat(‘1 0;0 1’)#生成一个矩阵print(ty…

    Java 2023年6月8日
    069
  • linux 与 windows 挖门罗币总结

    比特币之前一直很火,初次了解的时候才2000RMB一枚..看不懂哇,错失良机…当然了,看得懂也不买不起..当时还是穷学生. 最近又一直看到黑客利用linux漏洞挖门罗币…

    Java 2023年6月16日
    063
  • Linux 下的vim工具

    Vim/Vi简介Vim/Vi是一个功能强 大的全屏幕文本编辑器,是LinuxUNIX上最常用的文本编辑器,它的作用是立、编辑、显示文本文件。VimMi没有菜单,只有命令 Origi…

    Java 2023年6月7日
    058
  • Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!

    前言 本篇主要要介绍的就是 controller层的处理,一个完整的后端请求由4部分组成: 接口地&#x5…

    Java 2023年5月29日
    081
  • Latex公式导出word,Latex转换MathML使用POI导出公式可编辑的Word文件

    背景 之前在 使用spire.doc导出支持编辑Latex公式的标准格式word 博客中写过,使用spire.doc来生成word,不得不说spire.doc的api操作起来还是比…

    Java 2023年6月7日
    090
  • 重启rabbitmq服务

    重启rabbitmq服务通过两个命令来实现: rabbitmqctl stop :停止rabbitmq rabbitmq-server restart : 重启rabbitmq 因…

    Java 2023年5月30日
    0123
  • 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

    模块介绍 memc-nginx和srcache-nginx模块均为前淘宝工程师agentzh(章亦春)开发。其中memc模块扩展了Nginx标准的memcache模块,增加了set…

    Java 2023年5月30日
    076
  • Docker Container 就是一个进程,多新鲜啊?

    大家对 Docker 都应该有了或多或少的认识了,相信大家都是从这两张图来粗旷的理解 Docker 及容器概念的 那我们如何更轻松的理解容器 Container 呢?说白了 Con…

    Java 2023年6月5日
    080
  • springCloud feign使用/优化总结

    基于springCloud Dalston.SR3版本 1.当接口参数是多个的时候 需要指定@RequestParam 中的value来明确一下。 /** * 用户互扫 * @pa…

    Java 2023年6月16日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球