CSS 이야기: “규격을 따른다”라는 표현의 의미(conformance)

W3C 권고안에서 자주 사용되는 용어 중 하나가 “규격을 따르는 사용자 에이전트(Conforming User Agent)”입니다. 이렇게 어떤 규격을 “따른다”거나 규격에 “부합한다”라는 의미로 사용되는 단어가 “conformance”인데 conformance에 대한 W3C의 정의는 다음과 같습니다.

conformance : 표준(standard)이나 지침(guideline), 규격(specification)의 모든 요구 사항을 만족함

다시 말해서 W3C가 제안한 각각의 규격에 부합하기 위한 요건들을 뜻하는데 그렇기 때문에 규격문에서 상당히 중요한 의미를 갖습니다. 일반적으로 각각의 규격문은 세부적인 설명(속성 설명 등)을 시작하기 전에 이런 요건들을 먼저 설명하는데 예를 들어서 HTML 4.01 권고안 4장, XHTML 1.0 권고안 3장, 그리고 이 글에서 다룰 CSS 2.1 권고안 3장에서 독립적으로 다루고 있습니다.

넓은 의미로 conformance는 규격문을 어떻게 해석하고 구현해야 하는지, 반드시 준수해야 하는 사항(requirements)과 권장 사항(recommandations)을 어떻게 구별해야 하는지를 알려줍니다. 사실 “어떤 사항을 지켜야 한다”라고 말하면 듣는 사람에 따라서 “반드시 지켜야 한다”고 생각할 수도 있고, “지키는 것이 좋다”라고 해석할 수도 있기 때문에 정확함이 필수인 규격문에서는 이런 구분을 명확히 할 필요가 있습니다. 또한, 규격문 전체가 핵심적인 준수 사항만을 다루지는 않습니다. 설명이나 예제도 있고 비공식적인 권장 사항도 있으니까요. 이런 부분에 대한 구분도 conformance에서 다루고 있습니다.

설명이 길었는데 그만큼 중요하다는 점을 강조하고 싶었기 때문입니다. 그러면 CSS 2.1의 conformance를 살펴볼까요?

† 기본적으로는 CSS 2.1의 관련 내용을 정리한 것이지만 자의적인 설명이나 해석도 일부 있습니다. 이 점 염두에 두시기 바랍니다.

용어와 표현 정의

CSS 2.1 conformance에서 처음 다루는 내용은 핵심적인 표현 정의입니다. 먼저 “필수 사항”“권장 사항”, “재량 사항”을 나타내는 단어를 정의하고 있는데 흥미로운 사실은 이런 용어 정의를 다루는 규격이 따로 있다는 점입니다. 이 규격은 RFC2119로 W3C 권고안을 포함한 다수의 규격문에서 인용되는데 하버드 대학의 보안 책임자(Security Officer)이자 다양한 네트워크 관련 기술 표준을 만드는 IETF의 공동 책임자(co-director)인 Scott Bradner가 1997년 발표한 규격입니다.

† RFC는 “Request for Comments”의 약자로 네트워크 엔지니어들이 새로운 기술이나 개념, 때로는 유머 등에 대해 자유롭게 올리는 메모 형식의 문서인데 그 중 일부를 IETF가 표준으로 채택하고 있습니다. RFC2119의 제목은 RFC 문서에서 요구 조건을 명시하는데 사용할 키워드”입니다.

RFC2119의 핵심 내용은 아래 다섯 개의 키워드 정의입니다.

  • MUST(또는, REQUIRED, SHALL) : 반드시 지켜야 하는 사항
  • MUST NOT(또는, SHALL NOT) : 절대적으로 금지되는 사항
  • SHOULD(또는, RECOMMENDED) : 상황에 따라서 지키지 않을 수도 있지만 그런 경우라 해도 신중하게 판단해야 하는 사항
  • SHOULD NOT(또는, NOT RECOMMENDED) : 어떤 방식이 적합하거나 때로는 더 유용할 수도 있는 상황에 한해 허용될 수도 있지만 그런 경우라 해도 신중하게 판단해야 하는 사항
  • MAY(또는, OPTIONAL) : 규격을 받아들이는 제작사(vendor)가 시장의 요구나 기능 향상을 위해 자유롭게 선택할 수 있는 사항

그런데 영문 규격문을 한글로 번역하면 “should”의 의미가 모호해지기도 합니다. 일반적으로 “~해야 한다”로 해석하기 때문에 “반드시 ~해야 한다”는 의미로 사용되는 “must”와 혼동될 수 있기 때문입니다. 그렇기 때문에 규격문을 올바르게 이해하려면 이 두 표현 차이를 정확히 구분해서 받아들여야 합니다.

또한, W3C가 사용자나 사용자 에이전트에게 권장하는 “좋은 방식(good practice)”을 제안할 때가 있는데 이런 경우에는 “우리는 ~하는 것을 권장한다(We recommand ~)”, 또는 “이 규격에서는 ~하는 것을 권장한다(This specification recommends ~)”라고 표현합니다. “should”와 비슷한 의미로 해석될 수 있지만 둘 사이에는 분명한 차이가 있습니다. 다시 말해서 좋은 방식에 대한 권고는 비공식적이기 때문에 사용자나 사용자 에이전트가 어떻게 받아들이든 상관없이 conformance에 아무런 영향을 주지 않습니다.

규범적인 내용과 그렇지 않은 내용

이렇게 규격문 내에서 conformance와 상관없는 내용을 “비 규범적(non-normative)”이라고 표현하는데 간단히 말해서 따르지 않아도 된다는 뜻입니다. 비슷한 표현으로 “informative”가 있는데 단순히 정보만을 제공할 때 사용됩니다. 이 두 표현 모두 conformance와는 관계가 없습니다. 예를 들어서 위에 설명한 좋은 방식에 대한 권고나 규격문에 포함된 각종 예제, 노트는 전부 규범적인 내용이 아닙니다.

규격문에서는 규범적인 내용과 그렇지 않은 내용을 엄격하게 구분하는데 일반적으로 특별히 언급하지 않는 한 규격문의 모든 단락(부록(appendix)을 포함해서)은 규범적이고, 따라서 사용자나 사용자 에이전트는 해당 단락이 요구하는 모든 사항을 지켜야 합니다. 지키지 않아도 되는 일부 사항에 대해서는 규격문에서 명시적으로 비 규범적이라고 밝히고 있습니다.

또한, 특정 기능 사용이 금지되거나(deprecated) CSS3에서 금지될 예정이라고 표현하는 경우가 있는데 이런 표현도 conformance와는 관계가 없습니다. 예를 들어서 CSS 2.1 부록 A에서 다루는 음성 스타일 시트에서는 aural 미디어 유형이 금지되었다고 밝히고 있는데 이 사실은 conformance에 영향을 주지 않습니다. 하지만 실제로 사용자 에이전트는 aural 미디어 유형을 반드시 지원하지 않아도 무방한데 그 이유는 부록 A 전체가 정보 제공만을 위한 내용이라고 명시되어 있기 때문입니다. 부록 A 목차 다음에 나오는 첫 번째 내용은 다음과 같습니다. “This chapter is informative”.

비슷하게 시스템 칼라도 CSS3에서 금지될 예정이라고 밝히고 있습니다. 하지만 여기에서는 명시적으로 informative나 non-normative라고 밝히지 않기 때문에 conformance를 만족하려면 사용자 에이전트가 반드시 구현해야 합니다.

† 특정 속성이나 요소가 금지(deprecated)되었더라도 사용자 에이전트는 이를 지원해야 합니다. 하위 호환성 때문이지요. 대조적으로 폐기된(obsolete) 속성이나 요소는 사용자 에이전트가 지원하지 않아도 무방합니다. 규격문에서도 기록을 위한 목적을 제외하고 완전히 삭제됩니다.

앞서 설명한 예제와 노트는 온라인 규격문에서 일반적인 내용과 구분되도록 독자적인 색으로 표현됩니다. 예제의 경우는 밤색 텍스트로, 노트의 경우에는 녹색 텍스트로 표현됩니다. 설명을 위한 이미지는 특별히 언급하지 않는 한 결과를 보여주기 위한 용도이기 때문에 사용자 에이전트가 실제로 동일하게 표현해야 하는 것은 아닙니다.

사용자 에이전트 Conformance

먼저 CSS 2.1에서 정의하는 사용자 에이전트란 무엇인지 W3C의 정의를 통해서 알아보겠습니다(다른 규격에서는 다른 의미로 사용될 수도 있습니다).

사용자 에이전트는 문서 언어(HTML, XHTML 같은)로 작성된 문서를 해석해서 이 규격에 명시된대로 스타일 시트를 적용하는 모든 프로그램을 말한다. 사용자 에이전트는 문서를 시각적으로 보여주거나, 음성으로 표현할 수도 있고, 인쇄할 수도 있으며, 문서를 다른 형식(format)으로 변환할 수도 있다. 추가적으로 스타일 시트를 만들어내는 제작 툴(authoring tool)도 사용자 에이전트에 속한다.

사용자 에이전트가 CSS 2.1 규격에 부합한다고(conformance) 말할 수 있으려면 아래의 여섯 가지 사항을 준수해야 합니다.

  1. 반드시 하나 이상의 CSS 미디어 유형(screen, print 등)을 인식할 수 있어야 한다.
  2. 각각의 문서에 대해서 인식한 미디어 유형에 해당하는 모든 스타일 시트를 최대한으로 가져와야 한다. 네트워크 오류 등으로 인해서 모든 스타일 시트를 가져오지 못할 경우에는 가져올 수 있는 스타일 시트만으로 문서를 표현해야 한다.
  3. 반드시 스타일 시트를 규격에 따라서 해석해야 한다. 특히 모든 @ 규칙과 선언 블록, 선택자를 반드시 인식해야 한다. 그런 다음 사용자 에이전트가 지원하는 미디어 유형에 적용되는 속성이 있으면 속성 값을 규격에 명시된 속성 정의에 따라 반드시 해석해야 한다. 다시 말해서 유효한 속성 값은 반드시 받아들이고, 유효하지 않은 속성 값이 지정된 선언은 반드시 무시해야 한다. 또한, 지원하지 않는 미디어 유형에 적용되는 규칙도 반드시 무시해야 한다.
  4. 문서 구조(document tree)에 있는 모든 요소에 대해서 속성 정의와 캐스케이딩, 상속 규칙에 따라 모든 속성 값을 반드시 지정해야 한다.
  5. 문서에 대체 스타일 시트가 포함되어 있을 경우에는 사용자 에이전트가 적용할 스타일 시트를 반드시 사용자가 선택할 수 있도록 해야 한다.
  6. 사용자 에이전트는 제작자가 작성한 스타일 시트의 효과를 사용자가 제거하는 것을 반드시 허용해야 한다.

하지만 사용자 에이전트의 목적과 기능이 전부 동일하지 않기 때문에 사용자 에이전트 유형에 따라서 지원해야 할 사항이 달라집니다. 아래 세 가지 조항이 이를 설명하고 있습니다.

  • 문서 내용을 전혀 렌더링하지 않고 스타일 시트를 읽기만 하는 사용자 에이전트(CSS 2.1 validator 같은)는 1번부터 3번 항목을 반드시 준수해야 한다.
  • 스타일 시트를 만들어내는 제작 툴은 유효한 스타일 시트를 만들어내기만 하면 된다.
  • 스타일 시트를 이용해서 문서를 렌더링하는 사용자 에이전트는 1번부터 6번까지의 모든 조항을 준수해야 하며, 규격에 명시된 미디어 유형에 따른 요구사항에 따라서 문서를 렌더링해야 한다. 사용자 에이전트는 필요한 경우에 한해서 속성 값을 근사치로 계산할 수도 있다.

이외에도 몇 가지 항목을 더 설명하고 있는데 첫 번째는 장치의 제한에 대해서입니다. 예를 들어서 흑백 모니터에서는 사용자 에이전트가 칼라를 표현할 수 없는데 이런 장치의 한계 때문에 규격의 일부를 구현하지 못한다고 해서 규격을 준수하지 않는 것(non-conformance)은 아닙니다.

두 번째로 사용자 에이전트는 사용자가 자신만의 사용자 스타일 시트가 담긴 파일을 지정할 수 있도록 반드시 허용해야 합니다. 그렇지만 파일을 지정하거나 작성할 수 없는 장치에서 동작하는 사용자 에이전트는 이 요구 사항에 구속되지 않습니다. 또한, 사용자 에이전트는 그래픽 사용자 인터페이스(GUI) 같은 다른 방식으로 사용자가 자신이 선호하는 스타일을 선택하도록 할 수도 있습니다.

이제 중요한 마지막 항목이 남았습니다. CSS 2.1은 폼 컨트롤이나 프래임에 어떤 속성이 적용되고, 어떻게 스타일이 적용되는지를 정의하지 않습니다. 따라서 모든 요소에 적용된다고 정의된 속성이라도 폼 컨트롤이나 프레임에는 적용되지 않을 수 있습니다. 특히 폼 컨트롤 같은 경우에는 브라우저에 따라서 표현 방식과 적용되는 속성이 많이 다른데 CSS 2.1에서는 사용자 에이전트가 이런 요소에도 CSS 속성을 적용할 수 있다고만 밝히고 있습니다. 또한, W3C는 제작자가 이런 지원 방식을 시험적인 방식으로 받아들이기를 권고하고 있는데, 다시 말해서 현재의 규격을 따르기 위한 방식이 아니라는 뜻입니다. 그래서 차후 발표될 새로운 CSS 규격에서는 이런 부분을 명확히 할 수도 있다고 밝히고 있습니다.

† 폼 컨트롤을 시각적으로 표현하는 것은 전적으로 사용자 에이전트의 영역입니다. 따라서 select 같은 요소에 스타일이 적용되지 않는다고 해서 특정 사용자 에이전트가 CSS 규격을 어기는 것이 아닙니다. 또한, 동일한 사용자 에이전트라 해도 운영되는 플랫폼에 따라서 다르게 표현되기도 합니다. 대부분의 사용자는 자신이 사용하는 운영체제나 시스템이 제공하는 컨트롤에 익숙해져 있기 때문에 사용자 에이전트 대부분이 사용성(usability)을 높이기 위해서 제공되는 컨트롤을 그대로 이용하고 있습니다. 이런 이유로 현 시점, 그리고 앞으로도 CSS 규격이 폼 컨트롤 표현을 완벽하게 강제하기는 어렵다고 생각합니다.

운영체제, 사용자 에이전트에 따른 폼 컨트롤 렌더링 차이는 다양한 스크린샷을 제공하는 CSS로 폼 컨트롤 스타일 입히기 페이지를 참고하시기 바랍니다.

오류 처리와 MIME 타입

CSS 2.1 규격은 오류 처리에 관한 내용을 공식적으로 포함하고 있습니다. 이런 면에서 HTML 4.01과 대조되는데 HTML 4.01은 오류 처리에 대해서 공식적으로 규정하지 않기 때문입니다. 다만 어떤 방식으로 처리하는 것이 좋은지 노트 형식으로 권고는 하고 있는데 앞서 설명한 것처럼 informative한 항목입니다. CSS 2.1에서는 해석상의 오류 처리 방식처럼 필요할 경우에 명시적으로 오류 처리 방식을 제시하고 있습니다.

마지막으로 외부 스타일 시트가 전송될 때 text/css라는 content type이 외부 스타일 시트임을 나타낸다고 정의되어 있습니다. text/css 타입은 RFC2318에 등록되어 있습니댜.

CSS 2.1 규격에서 정확한 content type을 명시하고 있기 때문에 다른 content type으로 전송되는 외부 스타일 시트는 사용자 에이전트가 무시할 수도 있습니다. 예를 들어서 파이어폭스 2.0 표준 렌더링 모드는 text/css로 전송되지 않는 외부 스타일 시트는 해석하지 않습니다.

마치며

상대적으로 최근에 제정된 XHTML 1.0이나 XHTML 1.1 규격에서는 규범적인(normative) 내용과 그렇지 않은 내용(non-normative)를 명확하게 구분합니다. 각각의 장(챕터) 첫 번째 단락에 normative인지 아니면 non-normative, 또는 informative인지를 분명하게 밝히고 있는데 그만큼 규격문을 해석하는데 중요하기 때문입니다.

W3C 규격문은 상당히 체계적으로 구성되어 있습니다. 물론, 모호한 일부 규격도 있지만 전체적으로 봤을 때 더 나은 웹을 위한 고심을 느낄 수 있을만큼 잘 정리되어 있다고 생각합니다. 웹이 제공할 무한한 가능성에 대한 기대도 이런 고심을 바탕으로 하는 것이겠지요.

normative와 non-normative에 대한 다양한 예를 소개하면서 설명하려고 했는데 처음 예상했던 것보다 글이 너무 길어졌네요. ^^; 다음 글에서는 CSS 2와 CSS 2.1의 관계에 대해서 알아보겠습니다.

댓글 3개가 달렸습니다. 태그: , ,

  1. 박영식 | 2009-02-22 14:09

    잘 읽었습니다.!!

  2. 아슈 | 2014-05-08 10:25

    좋은글 감사합니다.

  3. 성민장군 | 2015-07-21 00:22

    Conforming User Agent 단어때문에 검색하다가 여기로~~~
    ㅋㅋㅋㅋㅋ 잘 지내시죵?

댓글이 닫혔습니다.