안녕하세요! 😊
이 문서는 RFC 9457의 내용을 시간순으로, 그리고 최대한 자세하게 구조화하여 설명합니다.
중요한 대사(문장)는 인용구로, 핵심 키워드는 굵게 또는 코드로 표시해 이해를 돕겠습니다.


1. 개요 및 목적

RFC 9457은 HTTP API에서 발생하는 오류를 기계가 읽을 수 있는 표준 형식으로 전달하기 위한 "문제 상세 정보(Problem Details)" 포맷을 정의합니다.
이전 표준인 RFC 7807을 대체하며, JSON과 XML 두 가지 형식을 지원합니다.

"이 문서는 HTTP 응답 콘텐츠에서 오류에 대한 기계 판독 가능한 세부 정보를 전달하는 '문제 상세 정보'를 정의합니다. 이를 통해 HTTP API마다 새로운 오류 응답 포맷을 정의할 필요가 없어집니다."

왜 필요한가요?

  • HTTP 상태코드만으로는 오류의 원인을 충분히 설명하기 어렵습니다.
  • 사람은 HTML 오류 페이지를 보고 이해할 수 있지만, API를 사용하는 프로그램은 그렇지 못합니다.
  • 따라서, 기계가 이해할 수 있는 구조화된 오류 정보가 필요합니다.

"HTTP 상태코드는 오류에 대한 충분한 정보를 제공하지 못할 때가 많습니다. 웹 브라우저를 사용하는 사람은 HTML 응답을 이해할 수 있지만, HTTP API의 비인간 소비자는 그렇지 않습니다."


2. 요구사항 용어

문서 내에서 MUST, SHOULD, MAY 등은 RFC 2119/8174에 따라 엄격한 의미로 사용됩니다.


3. 문제 상세 정보 JSON 객체

3.1 기본 구조

  • 문제 상세 정보는 기본적으로 JSON 객체입니다.
  • 미디어 타입은 application/problem+json입니다.
  • XML 형식(application/problem+xml)도 지원합니다.

예시

{
  "type": "https://example.com/probs/out-of-credit",
  "title": "잔액이 부족합니다.",
  "detail": "현재 잔액은 30이지만, 해당 상품의 가격은 50입니다.",
  "instance": "/account/12345/msgs/abc",
  "balance": 30,
  "accounts": ["/account/12345", "/account/67890"]
}

"잔액이 부족합니다."
"현재 잔액은 30이지만, 해당 상품의 가격은 50입니다."

  • type: 문제 유형을 식별하는 URI
  • title: 짧고 사람이 읽을 수 있는 요약
  • detail: 구체적인 설명
  • instance: 이 문제 발생의 고유 식별자(URI)
  • balance, accounts: 확장 필드 (문제 유형에 따라 추가 가능)

여러 오류를 한 번에 표현할 때

{
  "type": "https://example.net/validation-error",
  "title": "요청이 유효하지 않습니다.",
  "errors": [
    {
      "detail": "양의 정수여야 합니다.",
      "pointer": "#/age"
    },
    {
      "detail": "'green', 'red', 'blue' 중 하나여야 합니다.",
      "pointer": "#/profile/color"
    }
  ]
}

"요청이 유효하지 않습니다."
"양의 정수여야 합니다."
"'green', 'red', 'blue' 중 하나여야 합니다."

  • errors: 각 오류의 세부 정보를 배열로 제공

여러 문제 유형이 동시에 발생할 경우

  • 가장 중요한 문제만 응답에 포함하는 것이 권장됩니다.

3.1 문제 상세 정보 객체의 멤버

3.1.1 type

  • 문제 유형을 식별하는 URI (예: https://example.com/probs/out-of-credit)
  • 없으면 기본값은 about:blank
  • 절대 URI 사용을 권장합니다.

"type 멤버가 없으면 값은 'about:blank'로 간주합니다."

  • URI가 실제로 접근 가능한 경우, 문제 유형에 대한 문서를 제공해야 합니다.
  • 상대 URI는 혼동을 줄 수 있으니 주의!

3.1.2 status

  • HTTP 상태코드 (예: 403, 422 등)
  • 참고용이며, 실제 HTTP 응답의 상태코드와 일치해야 합니다.

"status 멤버는 참고용이며, 실제 HTTP 응답의 상태코드와 일치해야 합니다."

3.1.3 title

  • 문제 유형의 짧은 요약 (사람이 읽기 쉬움)
  • 문제마다 바뀌지 않고, 로컬라이징(다국어 지원)만 다를 수 있습니다.

3.1.4 detail

  • 이 문제 발생에 대한 구체적 설명
  • 클라이언트가 문제를 해결하는 데 도움이 되는 정보에 집중해야 합니다.

3.1.5 instance

  • 이 문제 발생의 고유 식별자(URI)
  • 실제로 접근 가능하면, 해당 문제에 대한 추가 정보를 제공할 수 있습니다.
  • 절대 URI 사용을 권장합니다.

3.2 확장 멤버(Extension Members)

  • 문제 유형에 따라 추가적인 멤버를 정의할 수 있습니다.
  • 예: balance, accounts, errors
  • 클라이언트는 모르는 확장 멤버는 무시해야 합니다.

"클라이언트는 인식하지 못하는 확장 멤버를 무시해야 하며, 이를 통해 문제 유형이 진화할 수 있습니다."


4. 새로운 문제 유형 정의하기

4.1 언제 새 문제 유형을 정의해야 할까?

  • HTTP 상태코드만으로 충분하지 않을 때 새 문제 유형을 정의합니다.
  • 디버깅 정보가 아니라, HTTP 인터페이스의 의미를 전달하는 용도입니다.
  • 보안상 주의: 내부 구현 정보를 노출하지 않도록 주의해야 합니다.

"문제 상세 정보는 내부 구현의 디버깅 도구가 아니라, HTTP 인터페이스 자체에 대한 더 많은 정보를 노출하는 방법입니다."

  • 너무 일반적인 문제(예: 403 Forbidden)는 굳이 새로 정의할 필요 없음

4.2 문제 유형 등록(Registry)

  • 공통적으로 쓰이는 문제 유형 URI는 IANA에 등록할 수 있습니다.
  • 등록 시에는 다음 정보를 포함해야 합니다:
    • Type URI
    • Title
    • 추천 HTTP 상태코드
    • 참고 문서

4.2.1 about:blank

  • 기본 문제 유형
  • 추가 의미 없이, HTTP 상태코드만으로 의미가 충분할 때 사용
  • 이 경우 title은 상태코드의 표준 문구(예: 404면 "Not Found")를 사용

"about:blank가 사용될 때, title은 해당 상태코드의 표준 문구와 같아야 하며, 필요에 따라 로컬라이징될 수 있습니다."


5. 보안 고려사항

  • 문제 상세 정보에 포함되는 정보는 신중하게 검토해야 합니다.
  • 민감한 정보(예: 스택 트레이스, 내부 경로 등)가 노출되지 않도록 주의!
  • status 멤버와 실제 HTTP 상태코드가 다를 경우 혼란이 생길 수 있으니, 항상 일치시키는 것이 좋습니다.

"문제 상세 정보를 생성할 때 포함되는 정보는 신중하게 검토되어야 하며, 시스템을 위험에 빠뜨릴 수 있는 정보가 노출되지 않도록 해야 합니다."


6. IANA 등록 사항

  • application/problem+json, application/problem+xml 미디어 타입이 이 문서를 참조하도록 갱신됨
  • HTTP Problem Types 레지스트리가 생성되고, about:blank이 기본값으로 등록됨

7. 참고 문헌

  • HTTP, JSON, XML, URI 등 관련 표준 문서가 참고로 명시되어 있습니다.

부록

A. JSON 스키마 예시

  • 문제 상세 정보 객체의 비공식 JSON 스키마가 제공됩니다.

B. XML 형식

  • XML 기반 API를 위한 문제 상세 정보 XML 포맷과 예시가 제공됩니다.

C. 기타 포맷과의 연동

  • HTML 등 다른 포맷에 문제 상세 정보를 포함하는 방법(예: <script type="application/problem+json">로 JSON 삽입)도 설명합니다.

핵심 요약 및 활용 팁

  • 문제 상세 정보(Problem Details)는 HTTP API에서 오류를 표준화된 구조로 전달하는 방법입니다.
  • 기본 필드: type, title, status, detail, instance
  • 확장 필드: 문제 유형에 따라 자유롭게 추가 가능
  • JSON/XML 모두 지원, 미디어 타입은 각각 application/problem+json, application/problem+xml
  • 보안상 민감 정보 노출 주의!
  • IANA 레지스트리를 통해 공통 문제 유형을 등록/재사용 가능

마무리

이상으로 RFC 9457의 주요 내용을 시간순, 구조적으로 정리해보았습니다!
이 표준을 따르면, API 오류 응답을 일관되고, 기계가 이해할 수 있으며, 확장 가능한 방식으로 제공할 수 있습니다.
궁금한 점이 있으면 언제든 질문해 주세요! 🚀


주요 키워드:

  • 문제 상세 정보(Problem Details)
  • HTTP API
  • JSON/XML
  • type, title, status, detail, instance
  • 확장 필드(Extension Members)
  • about:blank
  • 보안
  • IANA 레지스트리

RFC 9457 - Problem Details for HTTP APIs

함께 읽으면 좋은 글

Harvest건강한국어

애덤 스미스가 말하는 매력 자본, 『내 안에서 나를 만드는 것들』 📚

이 영상은 애덤 스미스의 두 가지 주요 저서, 『국부론』과 『도덕감정론』을 비교하며, 그의 철학적 깊이를 탐구합니다. 특히 『도덕감정론』을 현대적으로 해석한 『내 안에서 나를 만드는 것들』을 통해, ‘공정한 관찰자’ 개념과 ‘사랑’을 얻는 두 가지 방법(부와 명성 vs. 지혜와 덕성), 그...

2026년 5월 2일더 읽기
Harvest창업 · AI한국어

YC가 제안한 2026년 스타트업 요청서 핵심 요약

Y Combinator의 RFS는 “이걸 누가 풀어줬으면 좋겠다”는 미래 과제 목록으로, 꼭 여기에 적힌 아이디어가 아니어도 YC 지원에는 전혀 문제가 없다고 말합니다. Summer 2026 에디션의 큰 줄기는 AI가 ‘기능’이 아니라 ‘기반’이 되면서 소프트웨어·서비스·하드웨어·물리 세계...

2026년 4월 29일더 읽기
Harvest건강한국어

마라톤 서브2를 가능하게 만든 ‘전술·훈련·영양·러닝화’의 합체, 그리고 겨울 러닝 장비 체크리스트

2026 런던 마라톤에서 공식 대회 최초로 ‘2시간 벽’이 깨진 과정을, 진행자는 단순 감탄이 아니라 전술(네거티브 스플릿)·훈련 주기(10일 사이클)·뉴트리션(위장 훈련 포함)·러닝화 공학까지 묶어 심층적으로 해설한다. 동시에 데뷔전 서브2를 해낸 2위 선수가 던진 의미를 통해, 마라톤이...

2026년 4월 28일더 읽기