사전 RFC 2119
표준

RFC 2119

gabury1고친 사람 github-actions[bot]

RFC 2119 는 표준 문서가 규칙마다 얼마나 반드시 지켜야 하는지를 낱말 하나로 밝히게 해 줍니다. MUST 나 SHOULD 처럼 흔한 영어 낱말 열 개를 골라 뜻을 못박아 두었습니다. 다른 표준 문서는 이것을 끌어다 쓰기만 하면 강제와 권고를 가르는 방법을 저마다 다시 설명하지 않아도 됩니다.

쉽고 빠른 이해

RFC 2119 는 규칙을 얼마나 반드시 지켜야 하는지, 곧 요구 강도를 나타내는 낱말의 뜻을 정해 둔 문서입니다. 웹 표준을 읽다가 대문자 MUST 를 만나면, 그 규칙은 안 지키는 순간 그 표준을 따르지 않은 것이 됩니다.

이런 약속이 없으면 「해야 한다」가 강제인지 권고인지 읽는 사람마다 다르게 읽습니다. 같은 규격을 보고 만든 두 프로그램이 서로 안 맞는 일이 거기서 생깁니다.

읽는 방법은 이렇습니다.

  1. 규칙에 붙은 영어 낱말이 전부 대문자인지 봅니다
  2. 대문자면 MUST 는 강제, SHOULD 는 권고, MAY 는 선택으로 읽습니다
  3. 소문자면 보통 영어 낱말이라 요구 강도를 정하지 않습니다

쓰는 쪽에서는 서로 다른 구현이 맞물려 도는 데 정말 필요할 때만 이 낱말을 씁니다. 방법을 강요하려고는 쓰지 않습니다.

대가도 있습니다. SHOULD 는 어길 길을 열어 두기 때문에, 구현마다 갈리는 대목이 이 낱말에 몰립니다.

상세

이 문서가 정하는 것

RFC(Request for Comments)는 인터넷 기술을 다루는 문서에 번호를 붙여 내놓는 문서 묶음입니다. 번호를 붙여 내놓는 곳은 IETF(Internet Engineering Task Force)라는 인터넷 표준 단체입니다.

2119번 문서가 정하는 것은 요구 강도입니다. 요구 강도란 규칙 하나를 얼마나 반드시 지켜야 하는가입니다. 이 문서는 기술을 하나도 정하지 않습니다. 정하는 것은 그 강도를 나타내는 낱말의 뜻뿐입니다.

우리말로 옮긴 문서 제목이 그대로 「RFC 에서 요구 강도를 나타내는 데 쓰는 핵심 낱말」입니다. 1997년 3월에 나왔습니다. 쓴 사람은 Scott Bradner 입니다.

낱말의 뜻을 따로 정해 둔 까닭은 강도가 문장에 묻혀 안 보이기 때문입니다. 「해야 한다」가 강제인지 권고인지는 문서를 쓴 사람의 머릿속에만 있습니다. 읽는 쪽은 저마다 다르게 읽습니다. 강도를 정해진 낱말로 드러내 두면 읽는 쪽이 그 갈림을 문장 해석에 맡기지 않아도 됩니다.

뜻이 정해진 열 낱말

정해진 낱말은 열 개입니다. 뜻이 같은 것끼리 묶으면 다섯 덩이가 됩니다. 한 덩이 안에서는 어느 쪽을 골라 써도 뜻이 같습니다.

낱말 같은 뜻인 낱말 뜻
MUST REQUIRED · SHALL 그 표준의 절대적 요구입니다
MUST NOT SHALL NOT 그 표준의 절대적 금지입니다
SHOULD RECOMMENDED 따르는 것이 기본입니다. 이유를 대고 따져 봤으면 어겨도 됩니다
SHOULD NOT NOT RECOMMENDED 안 하는 것이 기본입니다. 이유를 대고 따져 봤으면 해도 됩니다
MAY OPTIONAL 정말로 선택입니다

한 줄에 같이 놓인 낱말은 골라 쓰는 취향만 다를 뿐 뜻이 같습니다. REQUIRED 를 만나면 MUST 를 만난 것과 같게 읽으면 됩니다.

어겼을 때 생기는 일

요구 강도의 차이는 규칙을 안 지켰을 때 무슨 일이 생기는지에서 드러납니다.

MUST 를 어긴 구현은 그 표준을 따르지 않은 것입니다. 「대체로 따른다」는 없습니다. 적합성을 재는 시험은 이 낱말이 붙은 규칙을 그대로 검사 항목으로 삼습니다.

SHOULD 는 어길 길을 열어 두되 조건을 답니다. 다른 길을 고르기 전에 그렇게 했을 때 따라오는 결과를 전부 이해하고 저울질해야 합니다. 그래서 SHOULD 는 「안 해도 된다」가 아니라 「이유를 댈 수 있으면 안 해도 된다」입니다.

MAY 는 넣어도 되고 안 넣어도 됩니다. 대신 짝이 하나 붙습니다. 그 기능을 넣은 구현과 안 넣은 구현이 서로 통해야 합니다. 없는 쪽은 그 기능이 주는 것만 못 누릴 뿐, 대화 자체가 깨지면 안 됩니다. 상호운용성을 지키려고 둔 단서입니다.

대문자일 때만 그 뜻

RFC 2119 는 이 낱말들이 「종종 대문자로 적힌다」고만 했습니다. 소문자 must 를 만난 사람은 이것도 강제인지 아닌지 헷갈렸습니다.

2017년 5월에 나온 RFC 8174 가 그 헷갈림을 정리했습니다. 전부 대문자로 적었을 때만 정해진 뜻이고, 소문자면 보통 영어 낱말이라 이 약속과 무관합니다.

한 가지가 더 분명해졌습니다. 이 낱말을 쓰는 것 자체는 의무가 아닙니다. 대문자 낱말이 하나도 없는 문장도 지켜야 할 규칙일 수 있습니다.

규칙 한 줄을 읽는 쪽에서 보면 판단은 이렇게 갈립니다.

flowchart TD
    A["규칙에 붙은 영어 낱말"] --> B{"전부 대문자인가"}
    B -->|아니다| C["보통 영어 낱말이다<br/>요구 강도를 정하지 않는다"]
    B -->|맞다| D{"어느 낱말인가"}
    D -->|MUST| E["어기면 이 표준을<br/>안 지킨 것이다"]
    D -->|SHOULD| F["이유를 대고 따져 봤다면<br/>어겨도 된다"]
    D -->|MAY| G["넣든 안 넣든 된다<br/>대신 서로 통해야 한다"]

다른 문서가 끌어다 쓰는 한 문단

표준 문서는 이 뜻을 자기 문서 안으로 들이려고 첫머리에 정해진 한 문단을 붙입니다. RFC 8174 뒤로는 이런 모양입니다.

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
"SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED",
"NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document
are to be interpreted as described in BCP 14 [RFC2119]
[RFC8174] when, and only when, they appear in all capitals,
as shown here.

이 문단이 하는 말은 「이 문서에서 대문자로 적힌 저 낱말들은 BCP 14 가 정한 뜻으로 읽어라」 입니다.

여기 나오는 BCP 14 는 RFC 2119 가 받은 또 하나의 번호입니다. 분류 이름은 BCP(Best Current Practice, 현행 최선 관행)이고, 그 분류에서 받은 번호가 14 입니다. RFC 번호는 한 문서에 평생 붙어 있습니다. BCP 번호는 같은 주제를 지금 맡고 있는 문서를 가리킵니다.

문서 번호 둘이 나란히 걸린 까닭이 여기 있습니다. BCP 14 는 RFC 2119 와 뒤에 나온 RFC 8174 둘로 이루어집니다.

인용 문단 · BCP 14 · 두 RFC 가 어떻게 맞물리는지를 그리면 이렇습니다.

flowchart TD
    subgraph C["BCP 14"]
        D["RFC 2119 · 낱말 열 개의 뜻"]
        E["RFC 8174 · 대문자일 때만 그 뜻"]
    end
    A["다른 표준 문서"] --> B["첫머리에 붙이는 인용 문단"]
    B --> C

표준 문서에 이 문단이 있으면 그 문서의 대문자 낱말을 위 표대로 읽으면 됩니다. 이 문단이 없으면 대문자로 적혀 있어도 그냥 강조일 수 있습니다.

아껴 쓰라는 단서

이 낱말들을 마음껏 쓰라고 만든 것은 아닙니다. 조심해서 아껴 쓰라는 단서가 같이 붙어 있습니다.

써도 되는 곳은 둘입니다. 서로 다른 구현이 맞물려 도는 데 그 규칙이 정말로 필요할 때, 그리고 해를 끼칠 수 있는 동작을 묶어 둘 때입니다. 재전송을 몇 번까지만 하라고 제한하는 규칙이 뒤쪽 예입니다.

막아 둔 쓰임도 있습니다. 구현하는 쪽에 특정 방법을 강요하려고 이 낱말을 쓰면 안 됩니다. 서로 통하는 데 그 방법까지 같을 필요가 없다면, 방법을 고르는 것은 만드는 쪽의 몫입니다.

RFC 는 정식 표준으로 올라간 것과 참고로만 내놓은 것이 나뉩니다. 낱말의 힘은 그 낱말이 실린 문서가 둘 중 어느 쪽인지를 따라갑니다. 표준으로 올라간 문서의 MUST 와, 참고로만 내놓은 문서의 MUST 는 같은 무게가 아닙니다. 둘을 가르는 기준은 표준화 트랙 쪽에 있습니다.

관련 항목

짝을 이루는 규범 문서

RFC 8174 · BCP · RFC 2026 · 인터넷 표준 · RFC 에디터

이 문서가 뜻을 정한 낱말

MUST · MUST NOT · REQUIRED · SHALL · SHALL NOT · SHOULD · SHOULD NOT · RECOMMENDED · NOT RECOMMENDED · MAY · OPTIONAL

이 낱말들을 끌어다 쓰는 표준 문서

RFC 9110 · RFC 9111 · JWT · OAuth 2.0 · XML · JSON · 시맨틱 버저닝 · DOM · WCAG

발행 단체와 절차

RFC · IETF · IANA · 인터넷 드래프트 · 표준화 트랙

요구 강도가 겨냥하는 목표

상호운용성 · 적합성 · 준수 시험 · 참조 구현 · 명세

다른 이름: Key words for use in RFCs to Indicate Requirement Levels