一次 Web 请求,服务器到底能看到什么?
------从 HTTP、代理、IP 到浏览器指纹的完整拆解
很多人对 Web 隐私的恐惧,来自一个根本问题:
"服务器到底能看到我什么?"这篇文章试图从工程视角,把这件事一次讲清楚。
一、一个 Web 请求到底由哪些部分组成?
从协议上看,一个 HTTP 请求由四部分组成:
请求行
请求头(Headers)
空行
请求体(Body)
1️⃣ 请求行
http
GET /api/user?id=1 HTTP/1.1
包含:
- HTTP 方法
- 请求路径
- 协议版本
2️⃣ 请求头(Headers)
http
Host: example.com
User-Agent: Chrome / Windows
Accept-Language: zh-CN
Cookie: JSESSIONID=xxx
这是浏览器主动携带的信息,包括:
- 浏览器类型
- 操作系统
- 语言
- Cookie
📌 请求头属于 HTTP 层
3️⃣ 请求体(Body)
用于 POST / PUT 等请求,承载表单或 JSON 数据。
二、服务器是怎么知道你的 IP 的?
很多人误以为:
"IP 是 HTTP Header 里的东西"
这是错误的。
真相是:
客户端 IP 来自操作系统内核,而不是 HTTP
真实链路如下:
网卡
↓
Linux 内核(TCP/IP 协议栈)
↓
Socket(accept)
↓
Tomcat
↓
HttpServletRequest
↓
Spring Boot
内核记录的 TCP 连接信息(五元组):
src_ip, src_port, dst_ip, dst_port, protocol
👉 client_ip = src_ip
为什么 Spring Boot 能直接拿到 IP?
java
request.getRemoteAddr();
这是因为:
- Tomcat 从 socket 拿到 IP
- 封装进
HttpServletRequest - Spring Boot 只是"使用者"
📌 Tomcat 不是内核,Linux kernel 才是
三、那 Header 里的 IP 是怎么回事?
你可能见过:
java
request.getHeader("X-Forwarded-For");
⚠️ 注意:
X-Forwarded-For 不是内核给的
它是:
- 代理
- Nginx
- 网关
主动写进 HTTP Header 的字符串
对比一下:
| 获取方式 | 来源 | 是否可信 |
|---|---|---|
| getRemoteAddr | 内核 socket | ✅ |
| X-Forwarded-For | HTTP Header | ⚠️ |
四、服务器能知道你从哪个网站跳转过来吗?
答案是:有可能,但不一定
这是通过 HTTP Header 中的 Referer 实现的:
http
Referer: https://www.bing.com/
现代浏览器默认策略:
- 跨站请求只带 域名
- 搜索关键词通常被隐藏
- 有时干脆不带 Referer
📌 网站最多知道你"来自哪个站",而不是你在那个站做了什么
五、Cookie 与 JSESSIONID 到底是什么?
1️⃣ JSESSIONID 的本质
http
Set-Cookie: JSESSIONID=ABC123
含义是:
"浏览器,请帮我记住这个会话 ID"
之后浏览器会自动带上:
http
Cookie: JSESSIONID=ABC123
📌 Cookie 是浏览器"主动配合"的机制
2️⃣ Cookie ≠ 登录
- Cookie 只是"身份证号"
- 登录态是否有效,由服务器决定
六、同一浏览器登录两个账号,服务器能知道是同一个人吗?
答案是:默认不能,但可以推断
三种层级:
1️⃣ 只用登录态(最干净)
- 账号 A 下线
- 账号 B 登录
- 后端完全当作两个用户
✅ 合规、正常
2️⃣ 使用设备 Cookie
http
device_id=abc123
服务器可以知道:
"账号 A 和 B 曾在同一设备登录过"
⚠️ 但不能 100% 认定是同一个自然人
3️⃣ 风控 / 行为画像
- IP
- 浏览器指纹
- 行为模式
👉 只能做概率判断
七、打字速度、行为特征真的能被记录吗?
是的,但有一个重要前提:
只能记录你在"当前网页输入框"里的行为
浏览器天然会触发:
text
keydown / keyup / input
通过事件时间戳,可以分析:
- 打字节奏
- 停顿位置
- 是否脚本操作
📌 这是反机器人技术,不是监听系统键盘
八、什么是 Canvas / WebGL 指纹?
1️⃣ Canvas 指纹
- 浏览器绘图接口
- 不同设备渲染有细微差异
- 导出像素结果作为特征值
2️⃣ WebGL 指纹
- 使用 GPU
- 显卡、驱动、精度差异
⚠️ 它们:
- 不是唯一 ID
- 只是概率特征
- 多用于风控
九、无痕模式到底能挡住什么?
能挡住:
- Cookie(持久)
- localStorage
- 浏览历史
挡不住:
- IP
- User-Agent
- Canvas / WebGL 指纹
- 行为特征
📌 无痕模式 = 不留本地痕迹,不是匿名
十、用了代理,服务器能知道吗?
一句话结论:
服务器知道你来自"代理 IP",但通常不知道你的真实 IP
请求头会不会暴露"我在用代理"?
👉 绝大多数情况下不会
除非是:
- 透明 HTTP 代理
- 企业代理
例如:
http
X-Forwarded-For: 真实IP
Via: proxy.xxx.com
十一、那服务器是怎么判断"你在用代理"的?
不是看 Header,而是看:
| 维度 | 示例 |
|---|---|
| IP 归属 | 机房 / 云厂商 |
| IP 复用率 | 同 IP 多用户 |
| 地理跳变 | 短时间跨国 |
| DNS 行为 | 解析地与访问地不一致 |
十二、什么叫"DNS 行为异常"?
正常情况:
- DNS 查询地 ≈ 访问 IP 地
异常情况:
- DNS 在中国
- HTTP 请求从美国来
👉 说明可能用了代理但 DNS 没走代理
十三、一个重要的分层认知(核心总结)
HTTP 层:你"说了什么"
网络层:你"从哪来"
代理:
- 改的是网络层(IP)
- 不改 HTTP 层(Header)
所以:
❌ "网站看 Header 就知道你在用代理"
✅ "网站通过 IP 和网络特征推断你可能在用代理"