X-Forwarded-For 헤더와 클라이언트 IP
왜 필요한가
브라우저가 Next.js 서버에 직접 연결되는 게 아니다. 실제 경로:
브라우저 → (CDN / 로드밸런서) → Next.js 서버
서버 입장에서 요청 IP를 보면 중간 프록시의 IP가 찍힌다. 원본 IP 정보가 프록시를 거치며 사라지기 때문. 이를 해결하기 위해 프록시들이 관행적으로 X-Forwarded-For 헤더에 원본 IP를 담아 전달한다.
헤더 구조
X-Forwarded-For: 123.456.789.0, 10.0.0.1
첫 번째 값이 브라우저의 실제 IP, 이후로 거친 프록시들의 IP가 순서대로 이어진다.
Next.js에서 읽기
const ip = req.headers['x-forwarded-for']?.split(',')[0]
Next.js가 특별한 무언가를 하는 게 아니다. Vercel·nginx 같은 인프라 레이어가 헤더를 세팅해주고, Next.js는 그냥 읽기만 한다.
주의: 헤더 조작 가능
클라이언트가 X-Forwarded-For: 1.2.3.4를 임의로 넣어 요청을 보낼 수 있다.
목적별 대응:
- 위치 정보 수집 — 조작해도 서비스 피해 없음. 그대로 써도 충분.
- 어뷰징 방지 — IP 단독으로 믿으면 안 됨. 대안:
- Vercel의
x-real-ip헤더 사용 (인프라 레이어에서 세팅, 클라이언트 조작 불가) - Rate limiting을
IP + User-Agent + 시간대복합 키로 - 근본적으로는 계정 기반 인증 — 로그인 없이 댓글 불가로 설정하면 IP 조작 자체가 의미 없어짐
- Vercel의