请说明在使用 Koa 框架开发时,后端服务可以通过哪些方式获取客户端请求的 IP 地址,并解释不同方法的适用场景或区别。
考察说明
考查对 Koa 请求对象中 IP 获取方式及代理场景下地址解析差异的掌握程度。
回答思路
- 【回答框架 1】Koa 的 ctx.request 对象中直接提供 ip 属性,等价于 ctx.ip,其值来自底层 Node.js 的 req.socket.remoteAddress,在非代理环境下即为客户端真实 IP。
- 【回答框架 2】当服务部署在 Nginx 或负载均衡器之后时,直接获取的 socket 地址通常是代理服务器的 IP。此时需要在 Koa 中设置 app.proxy = true,Koa 才会信任 X-Forwarded-For 头,并从中解析客户端真实 IP。
- 【回答框架 3】X-Forwarded-For 头可能由客户端伪造,若 app.proxy 设置为 true 而未对代理来源做限制,存在 IP 伪造风险。生产环境应在代理层重写该头,并在应用层按需校验或使用可信代理 IP 白名单。
- 【回答框架 4】除了 X-Forwarded-For,也可通过 X-Real-IP 等自定义头获取真实 IP,但 Koa 默认不解析这些头,需要自行读取 ctx.get('x-real-ip') 并配合代理配置使用。
- 【关键点 1】非代理环境下直接使用 ctx.ip 或 ctx.request.ip。
- 【关键点 2】代理环境下需设置 app.proxy = true,Koa 才会解析 X-Forwarded-For。
- 【关键点 3】X-Forwarded-For 可被伪造,直接信任存在安全风险。
- 【易错点 1】忘记设置 proxy 标志,导致获取的是代理服务器 IP。
- 【易错点 2】盲目信任客户端发送的 X-Forwarded-For 头,导致 IP 伪造。