译者序<br>前言<br>致谢<br>关于本书<br>关于作者<br>第一部分 基础<br>第1章 什么是API安全 2<br>1.1 打个比方:参加驾照考试 3<br>1.2 什么是API 4<br>1.3 API安全上下文 6<br>1.4 API安全要素 10<br>1.4.1 资产 11<br>1.4.2 安全目标 11<br>1.4.3 环境与威胁模型 13<br>1.5 安全机制 15<br>1.5.1 加密 16<br>1.5.2 身份识别和身份验证 17<br>1.5.3 访问控制和授权 18<br>1.5.4 审计日志 19<br>1.5.5 速率限制 20<br>小测验答案 21<br>小结 21<br>第2章 安全API开发 22<br>2.1 Natter API 22<br>2.1.1 Natter API概览 23<br>2.1.2 功能实现概览 24<br>2.1.3 设置项目 25<br>2.1.4 初始化数据库 26<br>2.2 开发REST API 28<br>2.3 连接REST终端 31<br>2.4 注入攻击 33<br>2.4.1 防御注入攻击 37<br>2.4.2 使用权限缓解SQL注入攻击 39<br>2.5 输入验证 40<br>2.6 生成安全的输出 45<br>2.6.1 利用XSS攻击 47<br>2.6.2 防御XSS攻击 49<br>2.6.3 实施防护 50<br>小测验答案 52<br>小结 53<br>第3章 加固Natter API 54<br>3.1 使用安全控制来处置威胁 54<br>3.2 速率限制解决可用性 55<br>3.3 使用身份验证抵御欺骗 61<br>3.3.1 HTTP基本身份验证 62<br>3.3.2 使用Scrypt确保密码安全存储 62<br>3.3.3 创建密码数据库 63<br>3.3.4 在Natter API中注册用户 64<br>3.3.5 验证用户 66<br>3.4 使用加密确保数据不公开 68<br>3.4.1 启用HTTPS 70<br>3.4.2 加强数据传输安全 71<br>3.5 使用审计日志问责 72<br>3.6 访问控制 77<br>3.6.1 强制身份验证 78<br>3.6.2 访问控制列表 79<br>3.6.3 Natter的强制访问控制 81<br>3.6.4 Natter空间增加新成员 83<br>3.6.5 避免提权攻击 84<br>小测验答案 85<br>小结 85<br>第二部分 基于令牌的身份验证<br>第4章 会话Cookie验证 88<br>4.1 Web浏览器的身份验证 88<br>4.1.1 在JavaScript中调用Natter API 89<br>4.1.2 表单提交拦截 91<br>4.1.3 提供同源HTML服务 91<br>4.1.4 HTTP认证的缺点 94<br>4.2 基于令牌的身份验证 95<br>4.2.1 令牌存储抽象 97<br>4.2.2 基于令牌登录的实现 98<br>4.3 Session Cookie 100<br>4.3.1 防范会话固定攻击 103<br>4.3.2 Cookie安全属性 105<br>4.3.3 验证会话Cookie 107<br>4.4 防范跨站请求伪造攻击 109<br>4.4.1 SameSite Cookie 111<br>4.4.2 基于哈希计算的双重提交Cookie 113<br>4.4.3 在Natter API中应用双重提交Cookie 116<br>4.5 构建Natter登录UI 121<br>4.6 实现注销 125<br>小测验答案 127<br>小结 127<br>第5章 最新的基于令牌的身份验证 128<br>5.1 使用CORS允许跨域请求 128<br>5.1.1 预检请求 129<br>5.1.2 CORS头 131<br>5.1.3 在Natter API中添加CORS头部 132<br>5.2 不使用Cookie的令牌 135<br>5.2.1 在数据库中保存令牌的状态 136<br>5.2.2 Bearer身份验证方案 141<br>5.2.3 删除过期令牌 143<br>5.2.4 在Web存储中存储令牌 143<br>5.2.5 修改CORS过滤器 146<br>5.2.6 对Web存储的XSS攻击 147<br>5.3 加固数据库令牌存储 149<br>5.3.1 对数据库令牌进行哈希计算 150<br>5.3.2 使用HMAC验证令牌 151<br>5.3.3 保护敏感属性 156<br>小测验答案 158<br>小结 159<br>第6章 自包含令牌和JWT 160<br>6.1 在客户端存储令牌状态 160<br>6.2 JSON Web令牌 163<br>6.2.1 标准JWT声明 165<br>6.2.2 JOSE头部 166<br>6.2.3 生成标准的JWT 168<br>6.2.4 验证签名JWT 171<br>6.3 加密敏感属性 172<br>6.3.1 认证加密 173<br>6.3.2 NaCl认证加密 175<br>6.3.3 加密JWT 177<br>6.3.4 使用JWT库 180<br>6.4 使用安全类型来加固API设计 183<br>6.5 处理令牌撤销 185<br>小测验答案 189<br>小结 189<br>第三部分 授权<br>第7章 OAuth2和OpenID Connect 192<br>7.1 作用域令牌 193<br>7.1.1 在Natter中添加作用域令牌 193<br>7.1.2 作用域和权限之间的区别 197<br>7.2 OAuth2简介 200<br>7.2.1 客户端类型 201<br>7.2.2 授权许可 201<br>7.2.3 发现OAuth2终端 203<br>7.3 授权码许可 204<br>7.3.1 重定向不同类型客户端的URI 208<br>7.3.2 使用PKCE增强授权码交换安全性 209<br>7.3.3 刷新令牌 210<br>7.4 验证访问令牌 211<br>7.4.1 令牌自省 212<br>7.4.2 确保HTTPS客户端配置安全 217<br>7.4.3 令牌撤销 219<br>7.4.4 JWT访问令牌 221<br>7.4.5 加密JWT访问令牌 227<br>7.4.6 让AS解密令牌 228<br>7.5 单点登录 229<br>7.6 OpenID Connect 230<br>7.6.1 ID令牌 231<br>7.6.2 加固OIDC 232<br>7.6.3 向API传递ID令牌 233<br>小测验答案 235<br>小结 235<br>第8章 基于身份的访问控制 237<br>8.1 用户和组 237<br>8.2 基于角色的访问控制 243<br>8.2.1 角色映射权限 244<br>8.2.2 静态角色 245<br>8.2.3 确定用户角色 247<br>8.2.4 动态角色 248<br>8.3 基于