ABOUT

성능과 운영 안정성을 함께 끌어올리는 개발자입니다.

92% Positional Error Reduction
79% p95 Latency Improvement
90%+ Long Tasks Reduction

2022.02 · 한국장학재단

우수 멘티

한국장학재단 사회 리더 대학생 멘토링 IT

2022.10 · 동작구청

우수 인재상

동작구청 우수 SW 인재

2025.05 · (주) 그랩

프로그래밍 우수상

(주) 그랩 우수 프로그램 개발

2025.05 · AWSKRUG

AWS한국사용자모임 발표

AI agent 스크립트 튜닝 관련 발표

ComputerScience

Development

Engineering

Trouble Shooting

GUESTBOOK

첫 마음부터
함께 나누는 온기

방명록 작성하러 가기

SUBSCRIBE

최신소식을
편하게 만나보세요.

헤더에 X- 접두사가 붙는 이유

도입

과거에 표준 필드와 사용자 정의 필드를 이름만으로 구분해 충돌을 피하려 했던 데 있으며, 오늘날에는 그 목적보다 부작용이 더 커져 새 헤더에는 권장되지 않는다는 점에 있다

개발 문서를 보다 보면 X-Requested-With, X-Forwarded-For, X-Frame-Options처럼 이름 앞에 X-가 붙은 헤더를 자주 보게 됩니다. 그래서 많은 사람이 “커스텀 헤더에는 원래 X-를 붙이는 것”이라고 기억하고 있습니다.

하지만 이건 현재의 권장 규칙이라기보다 역사적으로 형성된 관습에 가깝습니다. 원래는 비표준·실험용·사설 확장을 표준 이름 공간과 분리하려는 발상이었지만, 실제 운용에서는 오히려 마이그레이션 비용과 상호운용성 문제를 크게 만들었습니다. 그래서 지금은 “왜 X-를 붙였는가”보다 “왜 이제는 새로 붙이지 말라고 하는가”까지 같이 이해하는 것이 더 중요합니다.

필요성

X- 접두사 관습을 이해하면 오래된 문서와 현재 권장사항을 구분할 수 있고, 새 헤더 설계에서 불필요한 역사적 습관을 반복하지 않게 된다

실무에서는 아직도 오래된 API 문서나 사내 규칙에 “커스텀 헤더는 X-로 시작한다”는 문장이 남아 있는 경우가 많습니다. 이 관습이 왜 생겼는지 모르면, 그 규칙을 현재도 정답처럼 받아들이기 쉽습니다.

반대로 역사와 현재 기준을 함께 이해하면 상황을 분리해서 볼 수 있습니다. 기존 시스템이 역사적 이유로 X- 헤더를 쓰는 것은 이해할 수 있지만, 새로 설계하는 헤더에까지 같은 접두사를 붙이는 것은 더 이상 좋은 기본값이 아니라는 점을 명확히 판단할 수 있게 됩니다.

정의

X- 접두사 관습은 헤더나 다른 텍스트 이름 파라미터 앞에 X-를 붙여 그것이 표준화된 이름이 아니라 사용자 정의·실험용·사설 확장이라는 뜻을 암묵적으로 드러내려 했던 오래된 명명 규칙이다

중요한 점은 이것이 강제된 보편 법칙이라기보다, 여러 애플리케이션 프로토콜에서 퍼져 나간 관습적 명명 규칙이었다는 것입니다. 즉, 원래 의도는 “이 이름은 공식 표준 이름과는 다르게 취급해 달라”는 구분을 이름 자체에 새겨 넣는 데 있었습니다.

그래서 X- 접두사는 단순 장식이 아니라, 과거 설계자들이 이름 공간을 두 영역으로 나누고 싶어 했던 흔적이라고 볼 수 있습니다.

핵심 문장
X-는 원래 “이건 아직 표준 이름으로 보지 말자”는 구분 장치였지만, 시간이 지나면서 그 구분이 실제 운용에서는 잘 유지되지 않았습니다.

핵심 원리

X- 관습의 본질은 이름만 보고 상태를 구분하려는 발상이었지만, 실제 배포가 시작되면 이름보다 구현 호환성이 더 중요해져 결국 그 구분이 무너진다는 데 있다

이 관습은 이론상 꽤 그럴듯했습니다. 표준 이름 공간은 깨끗하게 두고, 실험용이나 사설 확장은 X- 쪽으로 보내면 서로 충돌하지 않을 것처럼 보였기 때문입니다.

문제는 비표준 이름이 실제 제품과 클라이언트에 널리 배포되기 시작하면, 더 이상 “임시”가 아니라는 점입니다. 그렇게 되면 나중에 표준 이름이 생겨도 기존 구현을 버릴 수 없고, 결국 X-fooFoo를 둘 다 지원해야 하는 상황이 생깁니다. 바로 이 지점에서 관습의 실효성이 무너집니다.

역사적 배경

X- 관습은 HTTP에서 갑자기 나온 것이 아니라, 1970년대 FTP 제안과 1982년 이메일 헤더 규칙에서 뿌리를 찾을 수 있고 이후 MIME, HTTP, vCard, LDAP 등으로 퍼졌다

역사적으로 보면 X- 관습은 HTTP만의 규칙이 아닙니다. RFC 6648은 그 시작점을 1975년 FTP 맥락의 제안까지 거슬러 설명합니다. 여기서는 정말 로컬한 특이사항을 위한 구분 문자로 초기 문자 X를 쓰자는 아이디어가 등장합니다.

이 관습이 본격적으로 명문화된 대표 사례가 RFC 822의 이메일 헤더입니다. RFC 822는 Extension-fieldsuser-defined-fields를 구분하고, 표준 확장 필드 이름은 X-로 시작하지 않을 것이라고 명시해 사용자 정의 필드에 “보호된 이름 공간”을 주려 했습니다. 이후 이 관습은 MIME, HTTP, vCard, LDAP 같은 여러 응용 프로토콜로 퍼졌습니다.

역사 흐름을 짧게 정리하면

1975년경 : FTP 쪽에서 로컬 특이 확장에 X 아이디어 등장
1982년   : RFC 822가 이메일 헤더에서 X- 관습을 사실상 명문화
이후     : MIME, HTTP, vCard, LDAP 등 여러 프로토콜로 확산
2012년   : RFC 6648이 새로 정의하는 이름에는 X- 사용을 지양하라고 정리

패턴 1. 왜 X-를 붙였나

과거에 X- 접두사를 붙인 가장 큰 이유는 표준 이름과 실험용·사설 확장 이름을 구분해 충돌을 줄이고, 사용자 정의 필드에 안전한 이름 공간을 주려는 것이었다

이 관습이 처음 퍼질 때의 논리는 비교적 단순했습니다. “표준화된 이름은 깨끗하게 두고, 비표준 이름은 따로 표식해 두면 나중에 충돌을 피할 수 있지 않을까?”라는 생각이었습니다.

즉, X-는 원래 이 이름은 아직 표준 이름 공간에 들어온 것이 아니다라는 경계 표시 역할을 기대받았습니다. 개발자 입장에서는 실험용 확장, 구현체 전용 필드, 사내 네트워크 전용 헤더를 빠르게 만들 수 있다는 장점도 있었습니다.

과거에 이 방식이 매력적으로 보였던 이유
  • 표준 이름과 비표준 이름을 겉으로 바로 구분할 수 있음
  • 사설/실험용 필드를 빠르게 만들기 쉬움
  • 표준 이름 공간과 충돌을 피할 수 있다고 기대함
  • 사용자 정의 필드에 “보호된 이름 세트”를 준다고 여김

패턴 2. 왜 지금은 지양되나

X- 관습이 폐기된 이유는 이름 공간을 깔끔하게 나누려던 의도와 달리, 비표준 이름이 실제 배포를 타면서 결국 표준 이름과 공존해야 하는 마이그레이션 문제를 거의 항상 만들었기 때문이다

RFC 6648이 지적하는 가장 큰 문제는 leakage입니다. 원래는 비표준 공간에만 있어야 할 X-foo가 구현체와 서비스에 널리 퍼지면, 나중에 표준 이름 Foo가 생겨도 바로 바꾸기 어렵습니다.

그러면 오래된 구현은 X-foo만 이해하고, 새 구현은 Foo만 이해하거나 둘 다 이해해야 합니다. 결국 새 구현은 호환성을 위해 옛 이름을 영구적으로 지원하게 되고, 그렇게 되면 원래 “임시 구역”이 사실상의 표준이 되어 버립니다. 이때 생기는 비용이 바로 상호운용성 문제이고, RFC 6648은 보안 민감한 경우 불필요한 취약점까지 이어질 수 있다고 지적합니다.

문제가 생기는 전형적인 흐름

1) 처음엔 실험용으로 X-Foo를 만든다
2) 구현체와 서비스가 이 이름을 널리 쓴다
3) 나중에 표준 이름 Foo가 생긴다
4) 기존 구현과의 호환 때문에 X-Foo를 버리지 못한다
5) 결국 X-Foo와 Foo를 둘 다 지원하게 된다
6) 이름 공간 분리의 이점은 사라지고 운영 비용만 남는다

HTTP 쪽에서도 비슷한 문제가 있었습니다. RFC 6648은 x-gzip, x-compress 같은 사례를 들고, 또 표준 필드 Archived-At와 함께 X-Archived-At를 병행 지원하게 된 예를 설명합니다. 이런 사례가 누적되면서 “차라리 처음부터 X-를 쓰지 말자”는 쪽으로 규범이 바뀌었습니다.

핵심 포인트
X-는 충돌을 피하려고 만든 표식이었지만, 실제로는 배포 이후 표준 이름과의 이중 호환 비용을 만들어 충돌을 더 오래 끌고 가는 경우가 많았습니다.

패턴 3. 지금 실무에서는 어떻게 보나

현재 실무 기준에서 새 헤더를 정의한다면 X-를 붙이는 것보다 의미 있는 이름을 고르고, 필요하면 등록 절차나 조직 식별자를 고려하는 쪽이 더 맞는 접근이다

RFC 6648의 권고는 분명합니다. 새로 만드는 textual parameter 이름에는 X-를 붙이지 말라는 것입니다. 또한 구현체는 이름에 X-가 있느냐 없느냐만 보고 “이건 표준이다 / 아니다”, “이건 안전하다 / 아니다” 같은 판단을 해서는 안 됩니다.

즉, 지금은 “비표준이면 X-를 붙인다”가 아니라, 처음부터 의미 있고 충돌 가능성이 낮은 이름을 고르고, 공개적으로 써야 한다면 등록과 문서화 절차를 밟는 것이 더 바람직한 방향입니다. 사설 확장이라면 조직명이나 도메인 감각을 반영해 더 구체적인 이름을 고민하는 쪽이 좋습니다.

  1. 새 헤더를 만들기 전에 이미 같은 의미의 표준 헤더가 있는지 먼저 본다.
  2. 정말 새 이름이 필요하다면 X- 없이 의미 있는 이름을 고른다.
  3. 이름만 보고 표준/비표준 여부를 추론하는 규칙은 만들지 않는다.
  4. 공개 확장이라면 등록과 문서화를 고려한다.
  5. 사설 확장이라면 조직이나 도메인 맥락이 드러나는 이름을 고민한다.

기존 X- 헤더는 어떻게 봐야 하나

중요한 실무 감각은 새 헤더에는 X-를 붙이지 않는 것과, 이미 배포된 X- 헤더를 무조건 즉시 없애는 것을 같은 말로 이해하지 않는 데 있다

RFC 6648도 이 점을 분명히 합니다. 기존 X- 이름을 계속 쓸지, 새 이름으로 옮길지는 해당 필드의 유지보수자와 생태계가 결정할 문제이지, “무조건 지금 당장 없애라”는 식으로 단정하지 않습니다.

즉, 이미 널리 쓰이는 역사적 X- 헤더가 존재하는 것은 이상한 일이 아닙니다. 예를 들어 X-Frame-Options는 실제로 RFC 문서가 존재하는 HTTP 헤더입니다. 이런 경우는 “현재 신규 명명 규칙의 모범”이라기보다, 과거 관습이 남아 있는 역사적 호환성 산물로 이해하는 편이 정확합니다.

실무 기준으로 정리하면
기존 X- 헤더는 “왜 아직 남아 있지?”라고 비난하기보다, 호환성 때문에 유지되는가, 대체 표준 이름이 있는가, 누가 실제로 아직 소비하고 있는가를 먼저 봐야 합니다.

한계와 주의점

X- 관습을 설명할 때 가장 주의할 점은 이것을 단순히 “옛날 방식”으로만 치부하지 않고, 왜 그 시절에는 합리적으로 보였고 왜 실제 운용에서는 실패했는지까지 함께 보는 것이다

과거 설계자들이 어리석어서 X-를 만든 것은 아닙니다. 당시에는 이름 충돌을 피하고 임시 확장을 구분하는 실용적인 방법처럼 보였고, 등록 절차도 지금보다 무겁게 느껴졌습니다.

다만 현대 기준에서는 이름 공간을 억지로 둘로 나누는 것보다, 의미 있는 이름과 더 단순한 등록 절차, 그리고 필요 시 조직/도메인 기반 구분을 쓰는 편이 더 낫다는 경험이 쌓인 것입니다. 그래서 X- 관습은 “틀린 발상”이라기보다 현실 배포와 표준화 과정을 거치며 효율을 잃은 역사적 관행으로 보는 편이 맞습니다.

자주 하는 오해

X- 접두사를 둘러싼 가장 흔한 오해는 X-가 붙으면 무조건 실험용이고, X-가 없으면 자동으로 표준이고, X-를 제거하면 곧바로 현대화가 끝난다고 믿는 데서 나온다
  • X-가 붙으면 무조건 비표준이라고 단정함
  • X-가 없으면 자동으로 표준이라고 생각함
  • X-는 보안상 더 안전하거나 더 위험하다고 이름만 보고 판단함
  • 새 헤더를 만들면서 아직도 “커스텀은 X-”라고 습관적으로 붙임
  • 기존 X- 헤더를 호환성 검토 없이 기계적으로 rename 하려 함
  • X- 관습이 HTTP만의 규칙이라고 생각함

실무 루틴

새 헤더 이름을 정할 때는 X-를 붙일지 말지 고민하는 것이 아니라, 이 헤더가 정말 필요한지, 공개 범위가 어디까지인지, 기존 이름과 충돌하지 않는지를 먼저 정리하는 순서가 맞다
  1. 기존 표준 헤더나 관례적 헤더로 해결 가능한지 먼저 확인한다.
  2. 새 이름이 꼭 필요하다면 X- 없이 의미 있는 이름을 고른다.
  3. 공개 API라면 문서와 등록 가능성까지 함께 고려한다.
  4. 사설/내부 확장이라면 조직 맥락이 드러나는 이름을 고려한다.
  5. 기존 X- 이름을 바꿀 때는 소비자 호환성과 이행 기간을 먼저 설계한다.
  6. 이름만 보고 표준/비표준/보안 상태를 추론하는 로직은 만들지 않는다.

판단 기준

실무에서 X- 헤더를 봤을 때는 “옛날 방식이네”로 끝내지 말고, 역사적 호환성인지 현재도 신규 설계에 쓰는 나쁜 습관인지부터 구분하는 편이 훨씬 중요하다
1
이 헤더가 역사적으로 널리 배포된 이름인지 먼저 본다.
2
동일 의미의 더 현대적인 이름이나 표준 필드가 이미 있는지 확인한다.
3
현재도 신규 설계에 계속 X-를 붙이고 있다면 문서 정책을 재검토한다.
4
마이그레이션이 필요하다면 old/new name 공존 기간을 어떻게 둘지부터 설계한다.
5
이름만 보고 신뢰 수준이나 보안 속성을 추론하는 로직이 있는지도 함께 점검한다.

요약

헤더에 X- 접두사가 붙는 관습적 이유는 과거에 표준 이름과 사용자 정의 이름을 분리해 충돌을 줄이려 했기 때문이지만, 실제 배포 환경에서는 비표준 이름이 널리 쓰이면서 오히려 마이그레이션과 상호운용성 비용을 키웠고, 그래서 오늘날에는 새 헤더 이름에 X-를 붙이지 않는 것이 더 나은 기본 원칙이 되었다
  • ✅ X-는 원래 표준 이름과 사용자 정의 이름을 구분하려는 관습적 접두사였다.
  • ✅ 이메일 헤더에서 RFC 822로 강하게 자리 잡았고 이후 HTTP 등으로 퍼졌다.
  • ✅ 목적은 충돌 회피와 보호된 이름 공간 확보였다.
  • ✅ 하지만 실제 배포에서는 X- 이름이 널리 퍼져 표준 이름과 이중 지원 비용을 만들었다.
  • ✅ RFC 6648은 새로 정의하는 이름에는 X- 사용을 지양하라고 정리했다.
  • ✅ 이름만 보고 표준/비표준/보안 여부를 자동 추론해서는 안 된다.
  • ✅ 기존 X- 헤더는 역사적 호환성 때문에 남아 있을 수 있다.
  • ✅ 새 헤더를 만든다면 X-보다 의미 있고 충돌 가능성이 낮은 이름을 택하는 편이 더 맞다.
728x90