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

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)

大家都在看

  • Java 包、包的编译

    Java 包 Java 采用包的概念来对相关的类进行管理。 包可以避免名称冲突,并且通过包名进行分类后,代码的维护性会有所提高。 包本质上就是一个个文件夹 以上都是 Java 的内…

    Java 2023年6月5日
    095
  • Java开发学习(二十)—-AOP总结

    切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数)异常名) execution(* com.itheima.service.*Service.*…

    Java 2023年5月29日
    064
  • Java两种核心机制

    1.Java虚拟机 2.垃圾回收 posted @2017-02-26 23:13 Big_Foot 阅读(250 ) 评论() 编辑 Original: https://www….

    Java 2023年5月29日
    081
  • idea使用教程-常用快捷键

    【1】创建内容:alt+insert【2】main方法:psvm【3】输出语句:sout【4】复制行:ctrl+d【5】删除行:ctrl+y 【6】代码向上/下移动:Ctrl + …

    Java 2023年6月5日
    070
  • markdown语法

    幽离的小日常markdown语法; 标题 一级标题 二级标题 三级标题 ……. 字体 粗体 斜体 斜粗体 删除线 引用 引用效果 分割线 图片 ! 超链接 …

    Java 2023年6月5日
    0100
  • Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了: 导出单个sheet 但是…

    Java 2023年6月15日
    093
  • 湘潭大学新生匿名问答网站——解湘 项目总结

    一.开发进度 温馨提示:左下角有音乐播放器 项目首页 大一暑假过半,7月29日建立本地工程文件 其中项目在github上经历七次push(第八次为修改配置文件,防止数据库泄露),但…

    Java 2023年6月7日
    077
  • 【进阶】Java8新特性的理解与应用

    【进阶】Java8新特性的理解与应用 前言 Java 8是Java的一个重大版本,是目前企业中使用最广泛的一个版本。 它支持函数式编程,新的Stream API 、新的日期 API…

    Java 2023年6月6日
    081
  • Redis入门实践

    #chkconfig:22345 10 90 #description: Start and Stop redis 随后执行: chkconfig redis_init_scrip…

    Java 2023年6月5日
    070
  • 坑爹的大页内存

    内存是计算机中的珍贵的稀有资源,所以为了精细管理,内存管理非常复杂的,一台计算机会同时运行很多应用,为了防止这些应用程序争抢内存,内存的管理是通过操作系统来管理的,操作系统为了方便…

    Java 2023年5月30日
    079
  • 题目: 给定一个数组,查询数组中指定的元素对应的索引

    package com.gao.test; /* 题目: 给定一个数组,查询数组中指定的元素对应的索引 */ public class TestDemo08 { public st…

    Java 2023年6月5日
    080
  • windows下perl的安装和脚本的运行

    https://www.aliyundrive.com/s/tFTCygW7ZUZ 直接双击运行下载的文件,首先会出现perl版本等等信息的介绍,不要理,直接next就会出现是否接…

    Java 2023年6月8日
    079
  • Elastic APM安装

    安装前准备: 安装之前事先安装好elasticsearch和kibana。 下载安装包: apm-server-7.0.0-linux-x86_64.tar.gz (服务端包)el…

    Java 2023年6月6日
    0109
  • Jquery——-获取网页参数

    作者:风清扬 No.1 出处: 如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的 按钮。 如果,您希望更容易地发现我的新博客,不妨点击一下右下角的 因为,我的写作热情也离…

    Java 2023年6月7日
    075
  • javax.swing自带的几种显示风格.使用LookAndFeelInfo查看

    public static void main(String args[]) { try { for (javax.swing.UIManager.LookAndFeelInfo …

    Java 2023年5月29日
    078
  • MySQL采用B+树作为索引的原因

    MySQL采用B+树作为索引的原因 1、MySQL的索引结构是如何查询的 在MySQL中,存储的数据记录都是持久化到磁盘中的,数据包含索引和记录,当MySQL查询数据时,由于索引也…

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