浅析前后端分离架构下的API安全问题:JWT保证token不被盗用的方案(即如何防范Replay Attacks)
前后端分离架构带来的好处一搜一大堆,这里主要讨论一下后端接口的安全问题。因为在分离的情况下,后端 api 是暴露在外网中的,常规的web项目无论如何前端都是要通过公网访问到后台api的,带来的隐患也有很多。比如:
(1)接口公开,谁都可以访问;
(2)数据请求的参数在传输过程被篡改;
(3)接口被重复调用。
一、为什么采用 Token
二、JWT如何保证token不被盗用
token就像一把钥匙,只要有了这把钥匙就可以把家里的东西往外搬,但万一token在客户端或者在传输过程中被截取了怎么办?做到如下可以降低 token 被盗风险。
1、在存储的时候把 token 进行对称加密存储,用时解开。
加密后的 token 被其他人得到以后,需要使用密钥进行解密后才能使用,其他人无法得到密钥就不能得到正确的 token。
2、将请求 URL、时间戳、token 三者进行合并加盐签名,服务端校验有效性。
最好结合1,2两种方式一起使用,token进行加密处理,将请求 URL、时间戳、加密后的token,三者进行合并加盐签名,因为盐值是保密的,所以其他人只是得到token的话,无法进行正确的签名,后端验证请求的签名值来判断请求是否有效。
3、验证 token 对应的 IP 地址或者移动端的设备id
每次请求可以将token和请求的对应的ip地址或设备id保存起来,放到数据库或者redis缓存中,如果后面请求token对应的ip地址或设备id不一样,则视为非法请求
4、如何防范Replay Attacks
token 解决了篡改数据的问题,还有第3个问题,那就是攻击者不修改数据,只是重复攻击。
所谓重复攻击就是攻击者发送一个后端服务器已接收过的包,来达到攻击系统的目的。比如在浏览器端通过用户名/密码验证获得签名的Token被木马窃取。即使用户登出了系统,黑客还是可以利用窃取的Token模拟正常请求,而服务器端对此完全不知道,因为JWT机制是无状态的。
那么如何解决呢?可以在Payload里增加时间戳,并且前后端都参与来解决:
(1)前端生成token时,在payload里增加当前时间戳;
(2)后端接收后,对解析出来的时间戳和当前时间进行判断,
(3)如果相差特定时间内(比如5秒),允许请求,否则判定为重复攻击
原文地址:https://www.cnblogs.com/goloving/p/15143919.html
- Spring Cloud Stream使用细节
- Redis3 对集群进行重新分片
- Spring Cloud Stream初窥
- jquery事件绑定性能测试
- Spring Cloud Bus整合Kafka
- 图解Mac下如何安装管理MySQL
- Spring Cloud Bus整合RabbitMQ
- 结合Scikit-learn介绍几种常用的特征选择方法(下)
- Spring Cloud Bus之RabbitMQ初窥
- 结合Scikit-learn介绍几种常用的特征选择方法(上)
- 判断图片是否加载完成
- Spring Cloud Config客户端配置细节
- Spring Cloud Config服务端配置细节(二)之加密解密
- Redis3 cluster 集群配置测试
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 计算机网络基础:这是一份详细HTTP学习指南
- Docker容器技术之Docker file
- 学会这15点,让你分分钟拿下Redis数据库
- 服务器性能指标——负载(Load)分析及问题排查
- 这20个Docker Command,有几个是你会的?
- Redis 备份、容灾及高可用实战
- 容器技术|Docker三剑客之Compose
- ProxySQL+Mysql实现数据库读写分离实战
- 打造高逼格、可视化的Docker容器监控系统平台
- 企业面试题|最常问的MySQL面试题集合(一)
- 深入理解消息中间件技术之RabbitMQ服务
- 手把手从0开始教你搭建Jumpserver,为服务器安全保驾护航!
- 企业面试题|最常问的MySQL面试题集合(二)
- 值得一看的35个Redis面试题总结
- 容器技术|Docker三剑客之docker-machine