- RFC 9839는 소프트웨어 개발 시 텍스트 필드에 포함될 수 있는 문제적 유니코드 문자를 명확히 정의함
- 이 RFC는 서로 다른 언어와 라이브러리에서 해당 문자 처리 일관성 부족에 따른 문제점을 다룸
- 9839에서는 덜 문제적인 세 가지 하위 집합을 제안하여 선택적으로 활용 가능함
- 기존의 PRECIS 프레임워크에 비해 적용이 더 쉽고 단순함
- RFC 9839용 Go 언어 라이브러리도 함께 공개되어 실제 활용에 도움을 줌
배경 및 RFC 9839 개요
- 유니코드는 거의 모든 텍스트 데이터 처리에서 표준으로 사용됨
- 하지만 실제 데이터 구조나 프로토콜 설계 시 모든 유니코드 문자를 허용하면 문제가 발생함
- Paul Hoffman과 필자는 계속 반복되는 유니코드 문제에 대한 명확한 기준을 제시하기 위해 IETF에 개별 초안을 제출함
- 2년간의 논의 끝에 공식 표준으로 채택되어 RFC 9839로 발표됨
- 이 문서는 문제적 문자 유형, 왜 문제가 되는지(기술적, 표준적 이유), 사용자가 골라 쓸 수 있는 하위 집합 세 개를 상세히 설명함
RFC 9839의 주요 내용
- 소프트웨어와 네트워크 환경에서 텍스트 필드 설계 시 필수적으로 참고해야 할 문서임
- RFC 9839는 10페이지 분량으로, IETF 표준 문서 중 간결한 편임
- 주로 소프트웨어 개발자와 네트워크 엔지니어를 대상으로 쉽게 설명되어 있음
문제적 유니코드 문자 사례
- 예시로 JSON의
username필드에 다음과 같은 문자열이 올 수 있음{ "username": "\u0000\u0089\uDEAD\uD9BF\uDFFF" } - 각 코드 포인트가 지닌 문제점
U+0000: 의미 없는 NULL 문자로 일부 프로그래밍 언어의 동작을 방해함U+0089: C1 제어 코드(CHARACTER TABULATION WITH JUSTIFICATION) 로, 그 동작이 복잡하고 일관성 없음U+DEAD: 쌍을 이루지 않은 서러게이트 문자로, UTF-16의 한계에서 비롯되는 문제임. 이상적이지 않은 데이터가 발생함\uD9BF\uDFFF(실제U+7FFFF) : Noncharacter로, 표준상 교환이 금지됨
- 위와 같은 코드 포인트는 데이터 구조와 프로토콜 내에서 일관적 처리 불가 및 예기치 않은 오류를 유발함
- RFC 9839는 이런 문제 문자를 공식적으로 정의하고, 배제할 유형을 명확히 제시함
JSON의 설계와 한계
- JSON 창시자인 Doug Crockford의 책임은 아님
- 유니코드가 충분히 성숙하지 않은 시기에 설계되어, 문자 집합을 엄격하게 제한하지 못했음
- 이제 표준을 변경할 수 없으므로, 문제 문자를 경험적으로 배제하는 방식이 필요함
IETF의 PRECIS 프레임워크와의 차이
- 2025년의 RFC 9839 이전에도, IETF에서는 RFC 8264(PRECIS Framework) 등 다양한 표준을 제공함
- 이 프레임워크는 국제화 문자열의 정제, 적용, 비교 방법을 상세히 다룸
- 43페이지 분량으로 배경 설명과 해결책이 포괄적임
- PRECIS는 유니코드 버전에 강하게 의존하며, 복잡하고 적용이 어려운 단점이 있음
- RFC 9839는 간결하고 실용성에 중점을 두었으며, 새로운 프로토콜 정의 시 신속한 채택이 용이함
RFC 9839의 하위 집합 및 활용 예시
- 9839는 세 가지 현실적인 하위 집합(scalars, XML, assignables)을 제시함
- 각 하위 집합은 배제할 문제적 문자 범위를 조금씩 달리함
- 다음은 주요 데이터 포맷과 RFC 9839의 하위 집합이 문제적 문자를 어떻게 처리하는지에 대한 표 요약임
- CBOR, TOML, XML, YAML 등 일부 포맷은 서러게이트 또는 컨트롤 문자를 부분적으로 배제함
- I-JSON은 서러게이트와 noncharacter를 배제함
- 일반 JSON, Protobufs는 배제하지 않음
- XML, YAML은 Charset 특성상 부분적으로만 noncharacter/컨트롤 코드를 제외함
- 참고: XML과 YAML은 Basic Multilingual Pane 이외의 noncharacter는 제외하지 않음
Go 언어용 RFC 9839 라이브러리
- RFC 9839의 세 하위 집합에 대한 문자 검증을 지원하는 작은 Go 라이브러리가 공개됨
- 충분히 테스트가 이루어졌으며 최적화는 아직 진행 중임
- 실제 현업에서 테스트 및 피드백을 환영함
RFC 9839의 의의와 작업 과정
- RFC 9839는 공동필자들과 여러 차례 피드백을 거쳐 15개 이상의 초안 수정 후 공식 발표됨
- 많은 커뮤니티 전문가들의 논의와 기여를 통해 초기안보다 훨씬 완성도 있는 문서로 발전함
- “Acknowledgements” 섹션에 기여자 명시함
RFC 개별 제출의 경험
- RFC 9839는 개별 제출(individual submission) 로 진행되었음
- Working Group을 통한 전통적 방식보다 노력과 절차의 부담이 큼
- Working Group 참여 경험과 비교 시, 전통적 방식이 더 효율적이고 추천할 만함