docs: collect evidence for the two-hop header contract failure
Control experiment isolates two independent causes: the nginx 443 block still emits X-Forwarded-Proto http, and Traefik rewrites forwarded headers regardless. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ae1f391598
commit
69d4502757
@@ -183,6 +183,59 @@ requestUrl http://app1.hyeonworks.com/api/echo
|
||||
|
||||
---
|
||||
|
||||
## 5-1. 대조 실험 — 원인이 둘임을 분리한다
|
||||
|
||||
측정값만으로는 "누가 값을 바꿨는지" 알 수 없다. nginx를 우회해 Traefik에
|
||||
직접 요청하여 원인을 분리했다.
|
||||
|
||||
```bash
|
||||
# test-server 에서, nginx 를 거치지 않고 노드의 Traefik 에 직접
|
||||
curl -s http://192.168.122.11/api/echo \
|
||||
-H 'Host: app1.hyeonworks.com' \
|
||||
-H 'X-Forwarded-Proto: https' \
|
||||
-H 'X-Forwarded-Port: 443' \
|
||||
-H 'X-Forwarded-For: 203.0.113.7'
|
||||
```
|
||||
|
||||
| | 보낸 값 | 도달한 값 |
|
||||
|---|---|---|
|
||||
| `X-Forwarded-Proto` | `https` | **`http`** |
|
||||
| `X-Forwarded-Port` | `443` | **`80`** |
|
||||
| `X-Forwarded-For` | `203.0.113.7` | **`10.42.0.1`** |
|
||||
|
||||
**올바른 헤더를 명시했는데도 전부 재작성됐다.** Traefik의 덮어쓰기가
|
||||
독립적으로 증명된다.
|
||||
|
||||
그리고 이 과정에서 **두 번째 원인**이 드러났다.
|
||||
|
||||
### 원인 A — nginx가 애초에 틀린 값을 보내고 있다
|
||||
|
||||
`/etc/nginx/sites-available/keycloak-lab`의 443 서버 블록:
|
||||
|
||||
```nginx
|
||||
listen 443 ssl default_server;
|
||||
...
|
||||
proxy_set_header X-Forwarded-Proto http; # ← https 여야 한다
|
||||
proxy_set_header X-Forwarded-Port 80; # ← 443 이어야 한다
|
||||
```
|
||||
|
||||
**TLS를 종료하는 서버가 "원래 요청은 평문이었다"고 알리고 있다.**
|
||||
HTTP 전용으로 먼저 세운 뒤 TLS를 얹는 과정에서 이 두 줄을 함께 바꾸지 않아
|
||||
남은 값이다.
|
||||
|
||||
문법 오류가 아니므로 `nginx -t`도 통과하고 **아무 경고 없이 잘못된 값이
|
||||
전파된다.** 이런 종류의 실수는 측정 없이는 드러나지 않는다.
|
||||
|
||||
### 원인 B — Traefik이 올바른 값이 와도 덮어쓴다
|
||||
|
||||
위 대조 실험이 보여준 것이다. `forwardedHeaders.trustedIPs` 미설정.
|
||||
|
||||
**두 원인은 직렬로 걸려 있다. A만 고쳐도 B 때문에 해결되지 않는다.**
|
||||
|
||||
> 증거 원자료: `docs/evidence/two-hop-proxy-headers/`
|
||||
|
||||
---
|
||||
|
||||
## 6. 원인 — 독립된 스위치 세 개
|
||||
|
||||
이 사슬에는 **각각 따로 켜야 하는 스위치가 세 개** 있다.
|
||||
|
||||
Reference in New Issue
Block a user