- API安全基础薄弱:系统讲解API安全的核心概念、安全目标与威胁模型,帮助读者建立完整的安全认知框架。
- 身份认证方案选择困难:深入剖析会话Cookie、Bearer令牌、JWT等主流认证机制,指导读者根据场景选择合适方案。
- 授权模型设计复杂:详解OAuth2、OIDC、Zanzibar等授权框架,解决多用户、多角色场景下的权限管理难题。
- 微服务与容器安全缺失:针对Kubernetes环境下的微服务API,提供从网络策略到服务网格的全方位加固策略。
- 物联网设备安全脆弱:分析IoT设备资源受限、威胁多样等特点,给出轻量级认证与加密的实用方案。
- 后端开发工程师:需要为Web或移动应用构建安全API,本书提供从理论到代码的完整指导。
- 技术架构师:负责设计分布式系统安全架构,本书涵盖微服务、Kubernetes等前沿场景。
- 安全工程师:专注于应用安全,本书深入剖析认证、授权漏洞及防御手段,提升攻防实战能力。
- DevOps工程师:需要保障CI/CD流水线中API的安全性,本书提供容器与编排环境的安全实践。
- 物联网开发者:面对设备资源限制与复杂威胁,本书专章讲解IoT API安全方案,极具参考价值。
- 基础优先:建议先精读第1-3章,掌握API安全的核心概念与基础编码技术,为后续学习奠定扎实根基。
- 认证与授权并重:第4-8章是全书精华,建议结合Natter API代码示例动手实践,理解令牌机制与授权模型。
- 场景化学习:根据工作需求选择性阅读,微服务开发者重点看第9-11章,IoT从业者直奔第12章。
- 实验驱动:每章末尾的小测验务必完成,并尝试修改代码验证安全机制,加深理解。
- 融会贯通:读完后回顾第1章的安全要素,将各章技术串联,形成系统化的API安全防护体系。
- 系统知识:构建完整的API安全知识体系,涵盖认证、授权、加密、审计等核心领域,不再碎片化学习。
- 实战技能:通过Natter API项目,掌握从零开发安全API的实操能力,可直接应用于工作项目。
- 威胁识别:学会分析常见攻击如SQL注入、XSS、CSRF、会话固定等,并掌握有效防御策略。
- 前沿视野:了解微服务、Kubernetes、物联网等新兴领域的API安全挑战与解决方案,保持技术领先。
- 最佳实践:积累大量安全编码规范与设计模式,提升代码质量,减少安全漏洞。
- 认证授权精通:深入理解OAuth2、OIDC、Zanzibar等主流协议,能够为复杂业务设计灵活的授权模型。
📖 Book Introduction
本书旨在引导读者掌握在不同环境下确保API安全所需的技术。首先介绍基本的安全编码技术,之后深入研究身份认证和授权技术。全书共5部分,13章,其中:第1部分介绍了API安全的基本原理,是本书其余内容的基础;第2部分更详细地介绍RESTful API的身份验证机制;第3部分介绍了授权(authorization)相关的内容;第4部分深入探讨了如何确保运行在Kubernetes环境下的微服务API的安全性;第5部分介绍物联网(IoT)中的API。这类API的安全尤其有挑战性,因为物联网设备的能力往往很有限,并且会遭遇到各种各样的威胁。对于构建Web程序有一定经验的开发人员来讲,本书可以提高他们对API安全技术和z佳实践的了解,也有助于技术架构师紧跟z新API安全方法技术更新的步伐。
译者序
前言
致谢
关于本书
关于作者
第一部分 基础
第1章 什么是API安全 2
1.1 打个比方:参加驾照考试 3
1.2 什么是API 4
1.3 API安全上下文 6
1.4 API安全要素 10
1.4.1 资产 11
1.4.2 安全目标 11
1.4.3 环境与威胁模型 13
1.5 安全机制 15
1.5.1 加密 16
1.5.2 身份识别和身份验证 17
1.5.3 访问控制和授权 18
1.5.4 审计日志 19
1.5.5 速率限制 20
小测验答案 21
小结 21
第2章 安全API开发 22
2.1 Natter API 22
2.1.1 Natter API概览 23
2.1.2 功能实现概览 24
2.1.3 设置项目 25
2.1.4 初始化数据库 26
2.2 开发REST API 28
2.3 连接REST终端 31
2.4 注入攻击 33
2.4.1 防御注入攻击 37
2.4.2 使用权限缓解SQL注入攻击 39
2.5 输入验证 40
2.6 生成安全的输出 45
2.6.1 利用XSS攻击 47
2.6.2 防御XSS攻击 49
2.6.3 实施防护 50
小测验答案 52
小结 53
第3章 加固Natter API 54
3.1 使用安全控制来处置威胁 54
3.2 速率限制解决可用性 55
3.3 使用身份验证抵御欺骗 61
3.3.1 HTTP基本身份验证 62
3.3.2 使用Scrypt确保密码安全存储 62
3.3.3 创建密码数据库 63
3.3.4 在Natter API中注册用户 64
3.3.5 验证用户 66
3.4 使用加密确保数据不公开 68
3.4.1 启用HTTPS 70
3.4.2 加强数据传输安全 71
3.5 使用审计日志问责 72
3.6 访问控制 77
3.6.1 强制身份验证 78
3.6.2 访问控制列表 79
3.6.3 Natter的强制访问控制 81
3.6.4 Natter空间增加新成员 83
3.6.5 避免提权攻击 84
小测验答案 85
小结 85
第二部分 基于令牌的身份验证
第4章 会话Cookie验证 88
4.1 Web浏览器的身份验证 88
4.1.1 在JavaScript中调用Natter API 89
4.1.2 表单提交拦截 91
4.1.3 提供同源HTML服务 91
4.1.4 HTTP认证的缺点 94
4.2 基于令牌的身份验证 95
4.2.1 令牌存储抽象 97
4.2.2 基于令牌登录的实现 98
4.3 Session Cookie 100
4.3.1 防范会话固定攻击 103
4.3.2 Cookie安全属性 105
4.3.3 验证会话Cookie 107
4.4 防范跨站请求伪造攻击 109
4.4.1 SameSite Cookie 111
4.4.2 基于哈希计算的双重提交Cookie 113
4.4.3 在Natter API中应用双重提交Cookie 116
4.5 构建Natter登录UI 121
4.6 实现注销 125
小测验答案 127
小结 127
第5章 最新的基于令牌的身份验证 128
5.1 使用CORS允许跨域请求 128
5.1.1 预检请求 129
5.1.2 CORS头 131
5.1.3 在Natter API中添加CORS头部 132
5.2 不使用Cookie的令牌 135
5.2.1 在数据库中保存令牌的状态 136
5.2.2 Bearer身份验证方案 141
5.2.3 删除过期令牌 143
5.2.4 在Web存储中存储令牌 143
5.2.5 修改CORS过滤器 146
5.2.6 对Web存储的XSS攻击 147
5.3 加固数据库令牌存储 149
5.3.1 对数据库令牌进行哈希计算 150
5.3.2 使用HMAC验证令牌 151
5.3.3 保护敏感属性 156
小测验答案 158
小结 159
第6章 自包含令牌和JWT 160
6.1 在客户端存储令牌状态 160
6.2 JSON Web令牌 163
6.2.1 标准JWT声明 165
6.2.2 JOSE头部 166
6.2.3 生成标准的JWT 168
6.2.4 验证签名JWT 171
6.3 加密敏感属性 172
6.3.1 认证加密 173
6.3.2 NaCl认证加密 175
6.3.3 加密JWT 177
6.3.4 使用JWT库 180
6.4 使用安全类型来加固API设计 183
6.5 处理令牌撤销 185
小测验答案 189
小结 189
第三部分 授权
第7章 OAuth2和OpenID Connect 192
7.1 作用域令牌 193
7.1.1 在Natter中添加作用域令牌 193
7.1.2 作用域和权限之间的区别 197
7.2 OAuth2简介 200
7.2.1 客户端类型 201
7.2.2 授权许可 201
7.2.3 发现OAuth2终端 203
7.3 授权码许可 204
7.3.1 重定向不同类型客户端的URI 208
7.3.2 使用PKCE增强授权码交换安全性 209
7.3.3 刷新令牌 210
7.4 验证访问令牌 211
7.4.1 令牌自省 212
7.4.2 确保HTTPS客户端配置安全 217
7.4.3 令牌撤销 219
7.4.4 JWT访问令牌 221
7.4.5 加密JWT访问令牌 227
7.4.6 让AS解密令牌 228
7.5 单点登录 229
7.6 OpenID Connect 230
7.6.1 ID令牌 231
7.6.2 加固OIDC 232
7.6.3 向API传递ID令牌 233
小测验答案 235
小结 235
第8章 基于身份的访问控制 237
8.1 用户和组 237
8.2 基于角色的访问控制 243
8.2.1 角色映射权限 244
8.2.2 静态角色 245
8.2.3 确定用户角色 247
8.2.4 动态角色 248
8.3 基于
到现在为止,我从事专业软件开发工作已经20年了,而且这些年,我用过各种各样的API。在我年轻的时候,曾经用BASIC语言和少量Z80机器代码编写过冒险游戏软件,那时根本不用担心有人会使用我的代码,更不用说通过接口调用代码了。直到1999年我以大学预科生的身份(有人亲切地称之为pooeys)加入IBM,我才第一次遇到供他人使用的代码。我记得某年夏天,我大胆地尝试将一个C++网络库集成到一个测试框架中,其间原作者通过一个简短的邮件对我进行了指导。在那个时候,我更关心的是如何破译那些难以捉摸的编译器错误信息,几乎不去考虑安全性问题。
随着时间的推移,API在概念上已经转变为涵盖可远程进行调用的接口了,而这时安全性就不再那么轻易地被忽略了。逃离令人恐怖的C++,我又置身于EJB(Enterprise Java Bean)的世界中,这里充斥着大量远程API调用以及数目众多的接口和样本程序。我几乎想不起来在那段日子里我用接口程序构建了什么,只知道这些代码程序是极其重要和必不可少的。之后,我们以SOAP和XML-RPC的形式添加了大量XML数据。但这没什么用。后来RESTful API和JSON的出现带来了一股清流:API最终变得非常简单,这时你就会有时间去考虑哪些接口是可以对外开放的。也正是在这个时候,我开始对安全产生了兴趣。
2013年,我入职ForgeRock,这是一家刚刚从Sun Microsystems的废墟上重新站立起来的初创公司。当时该公司正忙于为其管理产品编写认证和授权REST API,我正好加入了进来。在此过程中,我快速掌握了最新的基于令牌的授权和认证技术,这些技术在最近几年改变了API的安全性,本书很大一部分内容也来源于此。当Manning出版社建议我写一本书的时候,我马上就想到了要以API安全为主题来写这本书。
本书的大纲几经修改,但我始终坚持安全领域重在细节的原则。你不可能仅通过添加标记为“身份认证”和“访问控制”的外包装,就实现纯粹的架构级别的安全性。你必须确切地理解你要保护什么,以及这些“外包装”能够保证什么和不能保证什么。另外,安全领域也不适合那些零基础的读者。在本书中,我希望我们能够顺利地进入这样一个阶段—我能够为你解释清楚为什么事情是这样的,并提供许多常见安全问题的解决方案。
我坚持的另一个原则是安全技术并不是一劳永逸的。适用于Web应用程序的安全技术很可能根本不适用于微服务架构。依据我的经验,本书按照Web应用、移动客户端、Kubernetes环境下的微服务,以及物联网API等章节来分别阐述API安全。每个领域都有其自身的挑战和解决方案。
📑 Table of Contents
- 什么是API安全
- 安全API开发
- 加固Natter API
- 会话Cookie验证
- 最新的基于令牌的身份验证
- OAuth2与OpenID Connect
- 基于角色的访问控制
- 基于属性的访问控制与Zanzibar
- 微服务API安全
- Kubernetes环境下的安全部署
- 服务网格与零信任网络
- 物联网API安全
- API安全最佳实践与审计