이 문서는 캘린더 사용자의 사용 가능/사용 불가 시간대를 게시할 수 있도록 iCalendar에 새로운 구성요소를 정의하고, CalDAV 및 관련 스케줄링 프로토콜에서 이를 자유/바쁨 계산에 사용하는 방법을 규정한다.
URL: https://www.rfc-editor.org/rfc/rfc7953.txt
Internet Engineering Task Force (IETF) C. Daboo Request for Comments: 7953 Apple Updates: 4791, 5545, 6638 M. Douglass Category: Standards Track Spherical Cow Group ISSN: 2070-1721 2016년 8월
캘린더 가용성
초록
이 문서는 캘린더 사용자와 연관된 사용 가능(available) 및 사용 불가(unavailable) 시간 구간을 게시할 수 있도록 하는 새로운 iCalendar(RFC 5545) 구성요소를 규정한다. 이 구성요소는 표준 iCalendar free-busy 조회에서 사용할 수 있으며, iCalendar 전송 독립 상호운용 프로토콜(iTIP; RFC 5546)의 free-busy 요청을 포함한다. 이를 통해 필요에 따라 예외를 포함하면서 반복되는 사용 가능 또는 바쁨(busy) 시간 블록을 생성할 수 있다.
또한 이 문서는 Calendaring Extensions to WebDAV(CalDAV) 캘린더 접근 프로토콜(RFC 4791)과 연관 스케줄링 프로토콜(RFC 6638)에 대한 확장을 정의하여, free-busy 시간을 평가할 때 이 새로운 캘린더 구성요소를 어떻게 사용할 수 있는지 규정한다.
이 메모의 상태
이 문서는 인터넷 표준 트랙(Standards Track) 문서이다.
이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물이다. 이는 IETF 커뮤니티의 합의를 대표한다. 공개 검토를 거쳤으며 인터넷 엔지니어링 스티어링 그룹(IESG)에 의해 출판 승인을 받았다. 인터넷 표준에 대한 추가 정보는 RFC 7841의 2절에서 확인할 수 있다.
이 문서의 현재 상태, 정오표(errata), 그리고 피드백 제공 방법에 대한 정보는 http://www.rfc-editor.org/info/rfc7953 에서 얻을 수 있다.
Daboo & Douglass Standards Track [Page 1] RFC 7953 Calendar Availability August 2016
저작권 고지
Copyright (c) 2016 IETF Trust 및 문서 작성자로 식별된 사람들. 모든 권리 보유.
이 문서는 이 문서 출판일 기준으로 유효한 BCP 78 및 IETF Trust의 IETF 문서에 관한 법적 조항(http://trustee.ietf.org/license-info)의 적용을 받는다. 본 문서는 여러분의 권리 및 제한을 설명하므로 주의 깊게 검토해야 한다. 본 문서에서 추출된 코드 구성요소는 Trust 법적 조항 4.e절에 설명된 Simplified BSD License 텍스트를 포함해야 하며, Simplified BSD License에 설명된 바와 같이 어떠한 보증도 없이 제공된다.
목차
Daboo & Douglass Standards Track [Page 2] RFC 7953 Calendar Availability August 2016
캘린더 사용자는 종종 예약 가능(available)하거나 항상 예약 불가(always
unavailable)인 정기적인 시간 구간을 갖는다. 예를 들어, 사무직 근로자는
직장 동료에게 정상적인 ‘업무 시간’(예: 월요일금요일, 오전 9시오후 5시)
동안만 비어 있는 상태(free)로 보이기를 원할 수 있다. 또는 대학교 교수는
학기 중 특정 시간(예: 목요일 오후 2시~5시)에만 학생에게 가능할 수 있다.
이상적으로는 사용자가 이러한 구간을 자신의 캘린더 사용자 에이전트를 통해
직접 지정하고, 해당 사용자에 대한 일반적인 free-busy 조회의 일부로 자동
고려되도록 해야 한다. 또한 요청을 하는 사용자가 누구인지에 따라 서로 다른
사용 가능 시간 구간을 제시할 수 있어야 한다.
iCalendar [RFC5545]는 고정된 바쁨 시간 구간을 표현하는 데 사용할 수 있는 “VFREEBUSY” 구성요소를 정의하지만, 반복되는 사용 가능 또는 사용 불가 시간 구간을 지정하는 방법은 제공하지 않는다. 반복 패턴이 흔하기 때문에, “VFREEBUSY” 구성요소만으로는 이 문제를 해결하기에 충분하지 않다.
이 명세는 사용자 가용성을 게시(publish)하는 데 사용할 수 있는 새로운 유형의 iCalendar 구성요소를 정의한다.
CalDAV [RFC4791]는 캘린더 사용자가 캘린더 데이터를 접근 및 관리하고, 스케줄링 작업을 통해 이 데이터를 교환할 수 있는 방법을 제공한다. 그 일부로 CalDAV 캘린더 접근(calendar-access) 기능 [RFC4791]은 캘린더 컬렉션 또는 캘린더 컬렉션 계층에 대한 free-busy 정보를 반환하는 CALDAV:free-busy-query REPORT를 제공한다. 또한 CalDAV calendar-auto-schedule 기능 [RFC6638]은 캘린더 사용자의 free-busy 정보를 결정할 수 있게 한다. 이 두 작업 모두 사용자의 캘린더에서 시간을 ‘차단하는’ 이벤트를 검사하며, 차단된 기간은 “VFREEBUSY” 구성요소로 반환된다.
이 명세는 CalDAV calendar-access 및 CalDAV calendar-auto-schedule 기능을 확장하여, 새로운 iCalendar 가용성 구성요소를 저장 및 조작할 수 있게 하고, free-busy 조회 시 그러한 구성요소가 존재하는 경우 그 정보를 사용할 수 있도록 한다.
이 문서에서 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, “OPTIONAL”이라는 키워드는 [RFC2119]에 설명된 대로 해석해야 한다.
Daboo & Douglass Standards Track [Page 3] RFC 7953 Calendar Availability August 2016
이 문서에서 네임스페이스 “DAV:” 및 “urn:ietf:params:xml:ns:caldav”에 속한 XML 요소 타입이 XML 조각(fragment) 문맥 밖에서 참조될 때, 요소 타입 이름 앞에 각각 문자열 “DAV:” 및 “CALDAV:”를 접두(prefix)한다.
이 명세는 iCalendar에 새로운 “VAVAILABILITY” 캘린더 구성요소를 추가한다. “VAVAILABILITY” 구성요소는 새로운 “AVAILABLE” 하위 구성요소(subcomponent) 를 담는 컨테이너이다.
“VAVAILABILITY” 캘린더 구성요소의 목적은 특정 시간 범위에 걸친 사용 가능 시간 정보를 그룹화하는 것이다. 그 안에서 “AVAILABLE” 캘린더 하위 구성요소의 집합을 통해 사용 가능으로 표시된 특정 시간 범위들이 존재한다. 이들을 함께 사용하면, 정해진 기간에 걸쳐 반복될 수 있고 시간이 지나며 변할 수도 있는 사용 가능 시간을 지정할 수 있다.
“VAVAILABILITY” 및 “AVAILABLE” 구성요소가 동작하는 방식을 아래에 예시한다.
시간 범위
<=========================================================>
+-------------------------------------------------+
| VAVAILABILITY |
+-------------------------------------------------+
+------------+ +------------+
| AVAILABLE | | AVAILABLE |
+------------+ +------------+
<-> <-----> <-----------> 바쁨 시간
전체 시간 범위는 맨 위에 표시되어 있다. “VAVAILABILITY” 구성요소는 그 범위의 일부를 가로지른다. “VAVAILABILITY” 구성요소가 덮는 시간 범위는, “VAVAILABILITY” 구성요소 내부의 “AVAILABLE” 구성요소가 덮는 범위를 제외하고는 바쁨(busy)으로 간주된다.
3.1. VAVAILABILITY 구성요소
구성요소 이름: VAVAILABILITY
목적: 캘린더 사용자와 연관된 가용성을 설명하는 구성요소 속성 및 하위 구성요소의 그룹을 제공한다.
Daboo & Douglass Standards Track [Page 4] RFC 7953 Calendar Availability August 2016
형식 정의: “VAVAILABILITY” 캘린더 구성요소는 다음 표기법으로 정의된다.
availabilityc = "BEGIN" ":" "VAVAILABILITY" CRLF availabilityprop *availablec "END" ":" "VAVAILABILITY" CRLF
availabilityprop = *( ; ; 아래는 REQUIRED이며 ; 두 번 이상 나타나서는 안 됨 ; dtstamp / uid ; ; 아래는 OPTIONAL이며 ; 두 번 이상 나타나서는 안 됨 ; busytype / class / created / description / dtstart / last-mod / location / organizer / priority /seq / summary / url / ; ; 'dtend' 또는 'duration'은 ; 'availableprop'에 나타날 수 있지만, ; 'dtend'와 'duration'은 동일한 ; 'availabilityprop'에 함께 나타나면 안 됨. ; 'dtstart'가 없으면 'duration'은 ; 존재하면 안 됨. ; dtend / duration / ; ; 아래는 OPTIONAL이며 ; 한 번 이상 나타날 수 있음 ; categories / comment / contact / x-prop / iana-prop ; )
availablec = "BEGIN" ":" "AVAILABLE" CRLF availableprop "END" ":" "AVAILABLE" CRLF
Daboo & Douglass Standards Track [Page 5] RFC 7953 Calendar Availability August 2016
availableprop = *( ; ; 아래는 REQUIRED이며 ; 두 번 이상 나타나서는 안 됨 ; dtstamp / dtstart / uid / ; ; 'dtend' 또는 'duration'은 ; 'availableprop'에 나타날 수 있지만, ; 'dtend'와 'duration'은 동일한 ; 'availableprop'에 함께 나타나면 안 됨. ; dtend / duration / ; ; 아래는 OPTIONAL이며 ; 두 번 이상 나타나서는 안 됨 ; created / description / last-mod / location / recurid / rrule / summary / ; ; 아래는 OPTIONAL이며 ; 한 번 이상 나타날 수 있음 ; categories / comment / contact / exdate / rdate / x-prop / iana-prop ; )
설명: “VAVAILABILITY” 구성요소는 그 안에서 가용성 정보가 제공되는 시간 구간을 나타낸다. “VAVAILABILITY” 구성요소는 시작 시간과 종료 시간 또는 지속시간(duration)을 지정할 수 있다. “DTSTART”가 없으면 시작 시간은 무제한(unbounded)이다. “DTEND” 또는 “DURATION”이 없으면 종료 시간은 무제한이다. 지정된 시간 구간 내에서, 가용성의 기본값은 “BUSY-UNAVAILABLE”(3.2절 참조)인 free-busy 유형이며, “AVAILABLE” 하위 구성요소에 해당하는 시간 구간은 예외이다.
“AVAILABLE” 하위 구성요소는 둘러싸는(enclosing) “VAVAILABILITY”
구성요소의 시간 범위 내에서 자유 시간(free time) 구간을 나타내는 데
사용된다. “AVAILABLE” 하위 구성요소는 반복되는 시간 구간을 지정하기 위해
반복(recurrence) 속성을 포함할 수 있으며, 일반적인 iCalendar 반복 동작
(즉, “RECURRENCE-ID” 속성 사용)으로 재정의(overridden)될 수 있다.
Daboo & Douglass Standards Track [Page 6] RFC 7953 Calendar Availability August 2016
지정되는 경우, “VAVAILABILITY” 구성요소와 “AVAILABLE” 하위 구성요소의
“DTSTART” 및 “DTEND” 속성은 UTC 시간을 포함한 날짜 또는 로컬 시간과
타임존 참조를 포함한 날짜로 지정된 “DATE-TIME” 값이어야 한다.
“VAVAILABILITY” 구성요소를 포함하는 iCalendar 객체는, [RFC7809]가 적용
중이 아닌 한, 모든 구성요소의 모든 DATE-TIME 속성에서 사용된 각 고유한
“TZID” 매개변수 값에 대응하는 적절한 “VTIMEZONE” 구성요소를 포함해야
한다.
사용 가능 시간을 게시하는 데 사용될 때, “ORGANIZER” 속성은 게시된 사용
가능 시간과 연관된 캘린더 사용자를 지정한다.
“PRIORITY” 속성이 “VAVAILABILITY” 구성요소에 지정된 경우, 해당 구성요소를
다른 “VAVAILABILITY” 구성요소와 결합하는 방식을 결정하는 데 사용된다.
4절을 참조하라.
다른 캘린더 속성들도 “VAVAILABILITY” 또는 “AVAILABLE” 구성요소에 지정될
수 있으며, 표시된 시간 블록의 속성(attribute)으로 간주된다. 그 사용법은
애플리케이션에 따라 다르다. 예를 들어 “LOCATION” 속성은 어떤 사람이
주중 일부는 한 장소에서 가능하고 다른 일부는 다른 장소에서 가능함을
나타내는 데 사용될 수 있다(다만, 이런 추가 데이터를 더하는 것이 적절한
경우에 대해서는 9절 참조).
예시: 다음은 America/Montreal 타임존에서 월요일부터 금요일까지 오전 9시부터 오후 5시까지 항상 가능한 사용자의 가용성을 나타내기 위해 사용된 “VAVAILABILITY” 캘린더 구성요소의 예이다.
BEGIN:VAVAILABILITY ORGANIZER:mailto:bernard@example.com UID:0428C7D2-688E-4D2E-AC52-CD112E2469DF DTSTAMP:20111005T133225Z BEGIN:AVAILABLE UID:34EDA59B-6BB1-4E94-A66C-64999089C0AF SUMMARY:월요일부터 금요일까지 9:00~17:00 DTSTART;TZID=America/Montreal:20111002T090000 DTEND;TZID=America/Montreal:20111002T170000 RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR END:AVAILABLE END:VAVAILABILITY
Daboo & Douglass Standards Track [Page 7] RFC 7953 Calendar Availability August 2016
다음은 America/Montreal 타임존에서 2011년 10월 2일부터 2011년 12월 2일
사이에 월요일부터 목요일까지는 오전 9시부터 오후 5시까지 본사(main office)
에서 가능하고, 금요일은 오전 9시부터 정오 12시까지 지사(branch office)
에서 가능한 사용자의 가용성을 나타내기 위해 사용된 “VAVAILABILITY” 캘린더
구성요소의 예이다.
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:84D0F948-7FC6-4C1D-BBF3-BA9827B424B5
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Montreal:20111002T000000
DTEND;TZID=America/Montreal:20111202T000000
BEGIN:AVAILABLE
UID:7B33093A-7F98-4EED-B381-A5652530F04D
SUMMARY:월요일부터 목요일까지 9:0017:00
DTSTART;TZID=America/Montreal:20111002T090000
DTEND;TZID=America/Montreal:20111002T170000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH
LOCATION:본사
END:AVAILABLE
BEGIN:AVAILABLE
UID:DF39DC9E-D8C3-492F-9101-0434E8FC1896
SUMMARY:금요일 9:0012:00
DTSTART;TZID=America/Montreal:20111006T090000
DTEND;TZID=America/Montreal:20111006T120000
RRULE:FREQ=WEEKLY
LOCATION:지사
END:AVAILABLE
END:VAVAILABILITY
다음은 출장(여행) 근무자의 가용성을 나타내기 위해 사용된 세 개의
“VAVAILABILITY” 캘린더 구성요소 예이다: 월요일부터 금요일까지 매일
오전 9시부터 오후 5시까지 가능. 그러나 3주 동안은 몬트리올에서 근무하고,
그 다음 1주는 덴버에서 근무한 뒤, 다시 몬트리올로 돌아온다. 각 전체 기간이
별도의 “VAVAILABILITY” 구성요소로 덮여 있음을 주목하라. 마지막 구성요소는
DTEND가 없어서 “영원히” 계속된다. 이 예시는 사용 가능 시간의 “블록”을
표현하는 한 가지 방법을 보여준다. 우선순위를 사용하는 다른 접근법은
4절을 참조하라.
Daboo & Douglass Standards Track [Page 8] RFC 7953 Calendar Availability August 2016
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:BE082249-7BDD-4FE0-BDBA-DE6598C32FC9
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Montreal:20111002T000000
DTEND;TZID=America/Montreal:20111023T030000
BEGIN:AVAILABLE
UID:54602321-CEDB-4620-9099-757583263981
SUMMARY:월요일부터 금요일까지 9:0017:00
DTSTART;TZID=America/Montreal:20111002T090000
DTEND;TZID=America/Montreal:20111002T170000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
LOCATION:몬트리올
END:AVAILABLE
END:VAVAILABILITY
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:A1FF55E3-555C-433A-8548-BF4864B5621E
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Denver:20111023T000000
DTEND;TZID=America/Denver:20111030T000000
BEGIN:AVAILABLE
UID:57DD4AAF-3835-46B5-8A39-B3B253157F01
SUMMARY:월요일부터 금요일까지 9:0017:00
DTSTART;TZID=America/Denver:20111023T090000
DTEND;TZID=America/Denver:20111023T170000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
LOCATION:덴버
END:AVAILABLE
END:VAVAILABILITY
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:1852F9E1-E0AA-4572-B4C4-ED1680A4DA40
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Montreal:20111030T030000
BEGIN:AVAILABLE
UID:D27C421F-16C2-4ECB-8352-C45CA352C72A
SUMMARY:월요일부터 금요일까지 9:00~17:00
DTSTART;TZID=America/Montreal:20111030T090000
DTEND;TZID=America/Montreal:20111030T170000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
LOCATION:몬트리올
END:AVAILABLE
END:VAVAILABILITY
Daboo & Douglass Standards Track [Page 9] RFC 7953 Calendar Availability August 2016
3.2. 바쁨 시간 유형
속성 이름: BUSYTYPE
목적: 이 속성은 기본 바쁨 시간 유형을 지정한다.
값 타입: TEXT
속성 매개변수: IANA 및 비표준 속성 매개변수를 이 속성에 지정할 수 있다.
적합성: 이 속성은 “VAVAILABILITY” 캘린더 구성요소 내에서 지정할 수 있다.
형식 정의: 이 속성은 다음 표기법으로 정의된다.
busytype = "BUSYTYPE" busytypeparam ":" busytypevalue CRLF
busytypeparam = *(";" other-param)
busytypevalue = "BUSY" / "BUSY-UNAVAILABLE" / "BUSY-TENTATIVE" / iana-token / x-name ; 기본값은 "BUSY-UNAVAILABLE".
설명: 이 속성은 기본 바쁨 시간 유형을 지정하는 데 사용된다. 값은 “FREEBUSY” 속성에서 사용되는 “FBTYPE” 매개변수의 값과 대응하며, 이 속성에서는 “FREE” 값이 사용되지 않는다는 점만 예외이다. 이 속성을 허용하는 구성요소에 지정되지 않은 경우 기본값은 “BUSY-UNAVAILABLE”이다.
예시: 다음은 이 속성의 예이다.
BUSYTYPE:BUSY
“VAVAILABILITY” 구성요소는 반복 패턴을 통해 캘린더 사용자가 장기간에 걸친 가용성을 설명할 수 있게 한다. 이 가용성은 해마다 비교적 일정할 수 있다.
하지만 사람들은 휴가를 가거나 몇 주 동안 다른 사무실에 있을 수 있어 어느 정도 불규칙성이 존재하는 것이 보통이다. 그 기간 동안에는 가용성을 재정의할 필요가 있다. 기존 가용성을 수정하기보다는, “PRIORITY” 속성을 통해 새로운 “VAVAILABILITY” 구성요소가 더 낮은 서수 우선순위(ordinal priority) 를 가진 다른 구성요소를 덮어쓰도록 할 수 있다. iCalendar [RFC5545]는 “PRIORITY” 속성을 값 0은 정의되지 않음(undefined), 1이 가장 높은 우선순위, 9가 가장 낮은 우선순위로 정의한다는 점을 주목하라.
“VAVAILABILITY” 구성요소를 결합할 때, “PRIORITY” 속성이 없거나 값이 0이면 가장 낮은 우선순위 레벨을 의미한다. 두 개 이상의 VAVAILABILITY 구성요소가 겹치고 동일한 PRIORITY 값을 가진 경우, 겹치는 바쁨 시간 유형은 다음 순서에 따라 결정된다: BUSY > BUSY-UNAVAILABLE > BUSY-TENTATIVE. 즉, 한 구성요소의 BUSYTYPE이 BUSY이고 다른 구성요소의 BUSYTYPE이 BUSY-UNAVAILABLE라면, 겹치는 시간 범위에서의 유효 바쁨 시간 유형은 BUSY가 된다. 이들을 결합했을 때 일관되고 기대한 결과가 나오도록 보장하는 것은 이러한 구성요소 생성자의 책임이다.
사용 가능 시간을 계산하기 위해, 교차(intersect)하는 “VAVAILABILITY” 구성요소들을 우선순위에 따라 정렬한다(“PRIORITY” 값은 낮은 것에서 높은 것 순서가 0, 9, 8, 7, 6, 5, 4, 3, 2, 1).
그 결과 리스트의 “VAVAILABILITY” 구성요소를 순차적으로 처리한다. 각각에 대해, 해당 “VAVAILABILITY” 구성요소가 덮는 시간 범위를 바쁨으로 설정한 뒤, 그 “VAVAILABILITY” 구성요소 내 “AVAILABLE” 구성요소가 정의한 부분을 자유(free)로 설정한다.
만약 어떤 “VAVAILABILITY” 구성요소가 관심 있는 날짜 범위를 완전히 덮는다면, 더 낮은 우선순위의 “VAVAILABILITY” 구성요소는 무시할 수 있다는 점을 주목하라.
일반적으로 캘린더 사용자의 “기본(default)” 가용성(예: 월요일금요일
오전 9시오후 5시)은 가장 낮은 우선순위 레벨인 0을 사용한다. “기본”에 대한
모든 재정의(override)는 필요에 따라 더 높은 레벨을 사용한다. 어떤 재정의를
두 기존 구성요소 “사이에” 삽입해야 해서 “PRIORITY” 값을 계속 재조정해야 하는
상황을 피하기 위해, 우선순위 값은 전체 값 범위에 걸쳐 “간격을 두고(spaced
out)” 사용하는 것이 SHOULD이다. 아래 표는 이를 예로 보여준다. 첫째 행은 낮은
우선순위에서 높은 우선순위로의 범위를, 둘째 행은 대응하는 “PRIORITY” 속성
값을, 셋째 행은 해당 우선순위를 가진 “VAVAILABILITY” 구성요소가 무엇인지
나타낸다. “기본” 가용성은 우선순위 0({a})으로 생성되고, 첫 재정의는
우선순위 5({b})로 생성된다. 이후 두 구성요소 사이에 새로운 가용성을
삽입하려면 우선순위 7({c})을 사용할 수 있고, 모든 기존 것보다 우선하는
또 다른 구성요소는 우선순위 3({d})을 사용할 수 있다. 표에서 보듯 추가적인
“슬롯”이 열려 있어 필요하다면 다른 우선순위로 더 많은 “VAVAILABILITY”
구성요소를 추가할 수 있다.
+-----+----+----+-----+----+-----+----+-----+----+------+
| 낮음 | | | | | | | | | 높음 |
+-----+----+----+-----+----+-----+----+-----+----+------+
| 0 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
+-----+----+----+-----+----+-----+----+-----+----+------+
| {a} | | | {c} | | {b} | | {d} | | |
+-----+----+----+-----+----+-----+----+-----+----+------+
5. Free-Busy 시간 계산
이 절은 “VAVAILABILITY” 캘린더 구성요소가 존재할 때 캘린더 사용자의 free-busy 시간 정보가 어떻게 계산되는지 설명한다.
iCalendar “VFREEBUSY” 구성요소는 캘린더 사용자에 대한 “요약(rolled-up)”된 free-busy 시간 정보를 전달하는 데 사용된다. 이는 iTIP [RFC5546] free-busy 요청의 결과로 생성되거나 다른 메커니즘(예: CalDAV calendar-access CALDAV:free-busy-query REPORT)을 통해 생성될 수 있다.
하나 이상의 “VAVAILABILITY” 구성요소가 존재하고 free-busy 요청의 시간 범위와 교차하는 경우, 먼저 4절에 설명된 대로 사용 가능 시간을 계산한다. 그 다음 일반적인 “VEVENT” 및 “VFREEBUSY” 구성요소를 통상적인 방식으로 “오버레이”하여 시간을 차단(block out)할 수 있다.
예시 절차는 다음과 같다.
우선 free-busy 요청의 전체 기간을 자유(free)로 표시한다.
PRIORITY(낮음에서 높음)로 정렬한 각 “VAVAILABILITY” 구성요소에 대해:
A. “VAVAILABILITY”가 free-busy 요청의 시간 범위와 교차하는지 결정한다. 교차하지 않으면 무시한다.
B. “VAVAILABILITY”가 더 높은 우선순위 구성요소에 의해 완전히 덮어쓰여지는지 결정한다. 그렇다면 무시한다.
C. “VAVAILABILITY” 구성요소가 덮는 시간 구간에 대해, 해당 “VAVAILABILITY” 구성요소의 “BUSYTYPE” 속성에서 도출된 바쁨 시간 유형을 사용하여 free-busy 요청 결과 집합의 시간을 바쁨으로 표시한다.
D. 무시되지 않았다면, 3단계에서 추가 처리하기 위해 “VAVAILABILITY” 구성요소를 구성요소 리스트에 추가한다.
Daboo & Douglass Standards Track [Page 12] RFC 7953 Calendar Availability August 2016
2단계 결과 리스트에 있는 각 “VAVAILABILITY” 구성요소를, 첫 항목부터 마지막 항목까지의 순서로 처리한다.
A. 해당 “VAVAILABILITY” 구성요소의 각 “AVAILABLE” 구성요소에 대해:
i. 재정의된 인스턴스를 고려하면서 모든 반복 인스턴스를 확장한다.
free-busy 요청 시간 범위 또는 “VAVAILABILITY” 구성요소가 지정한
시간 구간 밖에 있는 인스턴스(또는 인스턴스의 일부)는 무시한다.
ii. 각 인스턴스에 대해, free-busy 요청 결과 집합에서 해당 시간을
자유로 표시한다.
각 “VEVENT” 또는 “VFREEBUSY” 구성요소에 대해, free-busy 요청 시간 범위 내에서 일반적인 free-busy 처리를 적용한다.
5.1. 예시
아래 예시에서는 free-busy 요청 기간의 시간 슬롯을 표로 표현한다. 각 시간 슬롯은 2시간 길이이다. 열 머리글은 로컬 시간 자정부터의 시간을 나타낸다. 열 머리글 아래의 각 행은 위 절차에 따라 free-busy 결과 집합을 결정하는 단계(step)를 나타낸다.
열 머리글 아래 행의 각 셀에는 해당 행이 나타내는 처리 단계가 끝났을 때의 free-busy 유형을 나타내는 단일 문자가 들어 있다. 문자는 다음과 같다.
F 해당 슬롯이 “FREE” 시간임을 나타낸다.
B 해당 슬롯이 “BUSY” 시간임을 나타낸다.
U 해당 슬롯이 “BUSY-UNAVAILABLE” 시간임을 나타낸다.
T 해당 슬롯이 “BUSY-TENTATIVE” 시간임을 나타낸다.
I 해당 슬롯의 데이터가 무시되어야 함을 나타낸다(위 2.B 단계 참조).
5.1.1. 단순 예시
부록 A는 사용자의 캘린더를 보여준다. 여기에는 요청된 시간 범위(오전 8시~ 오후 6시) 내의 사용 가능 시간을 제공하는 하나의 “VAVAILABILITY” 구성요소와, 정오 12시에 시작하는 2시간 회의를 나타내는 하나의 “VEVENT” 구성요소가 포함된다.
Daboo & Douglass Standards Track [Page 13] RFC 7953 Calendar Availability August 2016
America/Montreal 타임존에서 2011년 11월 6일 월요일 자정~자정에 대한 free-busy 요청은 위 단계에 따라 다음과 같이 계산된다.
+------+----+----+----+----+----+----+----+----+----+----+----+----+ | 단계 | 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | +------+----+----+----+----+----+----+----+----+----+----+----+----+ | 1. | F | F | F | F | F | F | F | F | F | F | F | F | | 2. | U | U | U | U | U | U | U | U | U | U | U | U | | 3. | U | U | U | U | F | F | F | F | F | U | U | U | | 4. | U | U | U | U | F | F | B | F | F | U | U | U | +------+----+----+----+----+----+----+----+----+----+----+----+----+
5.1.2. 추가 예시
부록 B는 위에 나온 출장 근무자의 가용성을 표현하는 또 다른 방법을 보여준다.
여기서는 월요일금요일 매일 오전 8시오후 6시의 기본 가용성을 기본
“PRIORITY”(DTEND가 없어 무제한)인 “VAVAILABILITY”로 표현한다. 사용자가 덴버에서
근무하는 주(10월 23일~10월 30일)에 대해서는, 기본 가용성을 덮어쓰는
우선순위 1의 “VAVAILABILITY” 구성요소로 가용성을 표현한다. 또한
(America/Denver 타임존에서) 정오 12시에 시작하는 2시간 회의가 있다.
America/Montreal 타임존에서 2011년 10월 24일 월요일 자정~자정에 대한 free-busy 요청은 위 단계에 따라 다음과 같이 계산된다. free-busy 요청의 타임존과 사용자의 가용성 및 회의의 타임존 사이에 2시간 차이가 있으므로, 이전 예시와 비교해 사용 가능 시간이 2시간 이동(offset)됨을 주목하라. “2.P0”는 기본 가용성을, “2.P1”은 더 높은 우선순위 가용성을 보여준다. “3.P1”은 기본 가용성이 무시되기 때문에 (위 2.B 단계) 더 높은 우선순위 가용성만이 전체 free-busy에 기여함을 보여준다.
+------+----+----+----+----+----+----+----+----+----+----+----+----+ | 단계 | 0 | 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 | 18 | 20 | 22 | +------+----+----+----+----+----+----+----+----+----+----+----+----+ | 1. | F | F | F | F | F | F | F | F | F | F | F | F | | 2.P0 | I | I | I | I | I | I | I | I | I | I | I | I | | 2.P1 | U | U | U | U | U | U | U | U | U | U | U | U | | 3.P1 | U | U | U | U | U | F | F | F | F | F | U | U | | 4. | U | U | U | U | U | F | F | B | F | F | U | U | +------+----+----+----+----+----+----+----+----+----+----+----+----+
Daboo & Douglass Standards Track [Page 14] RFC 7953 Calendar Availability August 2016
이 명세는 iTIP [RFC5546] 프로토콜을 사용해 전송되는 스케줄링 메시지에서 “VAVAILABILITY” 구성요소가 어떻게 사용되는지 정의하지 않는다. 향후 명세에서 iTIP 스케줄링이 “VAVAILABILITY” 구성요소를 어떻게 활용할 수 있는지 정의할 것으로 예상된다.
7.1. CalDAV 요구사항 개요
이 절은 저장된 캘린더 데이터에서 “VAVAILABILITY” 구성요소를 지원하는 CalDAV 서버에 필요한 기능을 나열한다. 서버는 다음을 수행해야 한다.
o 그러한 구성요소를 저장할 수 있는 캘린더의 CALDAV:supported-calendar-component-set 속성에서 “VAVAILABILITY” 구성요소 지원을 반드시(MUST) 알린다.
o 요청이 대상하는 캘린더 컬렉션에 있는 모든 “VAVAILABILITY” 구성요소의 정보를 집계(aggregate)하는 CALDAV:free-busy-query REPORT를 반드시(MUST) 지원한다.
o CalDAV calendar-auto-schedule 기능이 지원되는 경우, CalDAV 스케줄링 Inbox 컬렉션의 CALDAV:calendar-availability WebDAV 속성에 저장된 “VAVAILABILITY” 구성요소를 반드시(MUST) 지원한다.
o CalDAV calendar-auto-schedule 기능이 제공되는 경우, CalDAV free-busy에 기여하는 캘린더 컬렉션에 있는 모든 “VAVAILABILITY” 구성요소 또는 iTIP free-busy 요청이 대상으로 하는 캘린더 사용자의 CalDAV 스케줄링 Inbox 컬렉션의 CALDAV:calendar-availability 속성에 저장된 모든 “VAVAILABILITY” 구성요소의 정보를 집계하는 iTIP [RFC5546] free-busy 요청을 반드시(MUST) 지원한다.
“VAVAILABILITY” 구성요소의 처리는 CalDAV가 캘린더 객체 리소스에 부과하는 모든 요구사항( [RFC4791] 4.1절 참조)을 준수해야 한다.
Daboo & Douglass Standards Track [Page 15] RFC 7953 Calendar Availability August 2016
7.2. CalDAV의 새로운 기능
7.2.1. 캘린더 가용성 지원
이 문서에 설명된 기능을 지원하는 서버는 OPTIONS 요청에 대한 DAV 응답 헤더에 “calendar-availability”를 필드로 포함해야 한다. DAV 응답 헤더의 “calendar-availability” 값은 서버가 이 문서에 명시된 모든 요구사항을 지원함을 클라이언트에게 나타낸다.
7.2.1.1. 예시: OPTIONS를 사용한 캘린더 가용성 지원 발견(discovery)
요청 <<
OPTIONS /home/bernard/calendars/ HTTP/1.1 Host: cal.example.com
응답 <<
HTTP/1.1 200 OK Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL DAV: 1, 2, 3, access-control, calendar-access, calendar-availability Date: Fri, 11 Nov 2005 09:32:12 GMT Content-Length: 0
이 예시에서 OPTIONS 메서드는 DAV 응답 헤더에 “calendar-availability” 값을 반환하여 컬렉션 “/home/bernard/calendars/”가 이 명세에서 정의한 새로운 기능을 지원함을 나타낸다.
7.2.2. CalDAV 시간 범위 쿼리
[RFC4791] 9.9절은 서버가 반환하는 캘린더 구성요소 집합을 제한하기 위해 시간 범위를 지정하는 방법을 설명한다. 이 명세는 “VAVAILABILITY” 구성요소에 시간 범위 필터링을 적용하는 방법을 설명하기 위해 [RFC4791]을 확장한다.
“VAVAILABILITY” 구성요소는 아래 표에서 해당 구성요소 상태에 대응하는 조건을 만족하면 주어진 시간 범위와 겹친다고(overlap) 말한다. 조건은 “VAVAILABILITY” 구성요소에 “DTSTART”, “DTEND”, “DURATION” 속성이 존재하는지에 따라 달라진다. 또한 위에서 명시했듯 “DTEND” 값은(지정된 경우) “DTSTART” 값과 같거나 이후의 “DATE-TIME” 값이어야 한다.
+------------------------------------------------------------+
| VAVAILABILITY에 DTSTART 속성이 있는가? |
| +--------------------------------------------------------+
| | VAVAILABILITY에 DTEND 속성이 있는가? |
| | +----------------------------------------------------+
| | | VAVAILABILITY에 DURATION 속성이 있는가? |
| | | +------------------------------------------------+
| | | | 평가할 조건 |
+---+---+---+------------------------------------------------+
| Y | Y | N | (start < DTEND AND end > DTSTART) |
+---+---+---+------------------------------------------------+
| Y | N | Y | (start < DTSTART+DURATION AND end > DTSTART) |
+---+---+---+------------------------------------------------+
| Y | N | N | (end > DTSTART) |
+---+---+---+------------------------------------------------+
| N | Y | N | (start < DTEND) |
+---+---+---+------------------------------------------------+
| N | N | * | TRUE |
+---+---+---+------------------------------------------------+
7.2.3. CALDAV:free-busy-query REPORT
CALDAV:free-busy-query REPORT는 iCalendar “VAVAILABILITY” 구성요소를 포함하는 캘린더 컬렉션에서 실행될 수 있다. 그런 경우 서버는 5절에 설명된 대로 free-busy 응답을 생성할 때 모든 “VAVAILABILITY” 구성요소의 정보를 반드시(MUST) 집계해야 한다.
7.2.4. CALDAV:calendar-availability 속성
이름: calendar-availability
네임스페이스: urn:ietf:params:xml:ns:caldav
목적: Inbox 소유자인 캘린더 사용자를 대상으로 하는 iTIP free-busy 요청이 있을 때 free-busy 시간을 계산하는 데 사용될 “VAVAILABILITY” 구성요소를 정의한다.
적합성: 이 속성은 보호(protected)될 수 있으며 PROPFIND DAV:allprop 요청으로는 반환되지 않는 것이 SHOULD NOT이다. 이 속성 지원은 REQUIRED이다. 이 속성의 값은 오직 하나의 “VAVAILABILITY” 구성요소와 선택적으로 “VTIMEZONE” 구성요소만 포함하는 유효한 iCalendar 객체여야 하며, 다른 iCalendar 구성요소는 존재해서는 안 된다(MUST NOT). [RFC7809]가 적용 중이면 “VTIMEZONE” 구성요소는 존재하지 않는 것이 SHOULD NOT이다. 더 복잡한 가용성 시나리오를 위해 클라이언트는 캘린더 사용자의 캘린더 컬렉션에 여러 “VAVAILABILITY” 구성요소를 저장할 수 있다.
설명: 이 속성은 이 속성 값에 “VAVAILABILITY” 구성요소를 포함함으로써 사용자가 자신의 가용성을 지정할 수 있게 한다. 존재한다면 서버는 서버가 처리하는 iTIP free-busy 요청의 일부로 free-busy 정보를 결정할 때 이 “VAVAILABILITY” 구성요소를 반드시(MUST) 사용해야 한다.
정의:
; 데이터 값은 “VAVAILABILITY” 또는 “VTIMEZONE” 구성요소를 포함하는 ; iCalendar 객체여야 한다.
예시:
BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//example.com//iCalendar 2.0//EN VERSION:2.0 BEGIN:VAVAILABILITY UID:9BADC1F6-0FC4-44BF-AC3D-993BEC8C962A DTSTAMP:20111005T133225Z DTSTART;TZID=America/Montreal:20111002T000000 BEGIN:AVAILABLE UID:6C9F69C3-BDA8-424E-B2CB-7012E796DDF7 SUMMARY:월요일부터 금요일까지 9:00~18:00 DTSTART;TZID=America/Montreal:20111002T090000 DTEND;TZID=America/Montreal:20111002T180000 RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR END:AVAILABLE END:VAVAILABILITY END:VCALENDAR
7.2.5. iTIP Free-Busy 요청
CalDAV calendar-auto-schedule 기능([RFC6638] 5절 참조)은 CalDAV 프로토콜을 통해 free-busy 정보를 요청할 수 있는 메커니즘을 포함한다. 그러한 요청 동안 대상이 되는 모든 캘린더 컬렉션 내 “VAVAILABILITY” 구성요소는 전체 free-busy 정보를 계산하는 일부로 반드시(MUST) 포함되어야 한다. 또한 소유자의 Inbox에 있는 CALDAV:calendar-availability 속성에 지정된 “VAVAILABILITY” 구성요소도 free-busy 계산에 반드시(MUST) 포함되어야 한다. 이러한 모든 “VAVAILABILITY” 구성요소의 처리는 5절에 따른다.
Daboo & Douglass Standards Track [Page 18] RFC 7953 Calendar Availability August 2016
특히 여러 시간 범위가 겹치는 경우 가용성 정보 계산은 복잡할 수 있으므로, CalDAV 서버는 클라이언트가 저장하는 데이터의 복잡도를 제한해야 한다(MUST).
캘린더 사용자의 캘린더 데이터에 가용성 정보를 “주입(inject)”할 수 있는 공격자는 사용자가 회의에 대해 결코 비어 있는 것처럼 보이지 않게 하거나 부적절한 시간에 비어 있는 것처럼 보이게 만들 수 있다. 캘린더 시스템은 캘린더 사용자의 가용성 정보가 권한 있는 사용자만에 의해 수정될 수 있도록 반드시(MUST) 보장해야 한다.
[RFC5545], [RFC5546], [RFC4791], [RFC6638], [RFC7809]의 보안 고려사항도 반드시 준수되어야 한다(MUST).
Free-busy 및 가용성 정보는 공격자가 해당 캘린더 사용자의 위치나 전반적인 “활동” 수준을 추론하는 데 사용될 수 있다. 사용자가 자신의 free-busy 및 가용성 정보를 노출할 수 있게 하는 모든 캘린더 시스템은, 그 정보에 대한 접근을 권한 있는 사용자로만 제한해야 한다(MUST).
“VAVAILABILITY” 구성요소를 다른 캘린더 사용자에게 전송하거나 공유할 때는, 각 수신자에게 필요한 것 이상을 노출하지 않도록 주의해야 한다. 예를 들어 사업주는 고객이 자신이 어디에 있는지 또는 무엇을 하고 있는지 알기를 원하지 않겠지만, 가족 구성원끼리는 서로 그러한 정보를 공개할 수도 있다. 따라서 “VAVAILABILITY” 구성요소를 다른 캘린더 사용자에게 전송 또는 공유할 수 있게 하는 캘린더 시스템은 불필요한 속성(예: “SUMMARY”, “LOCATION”, “DESCRIPTION”) 을 제거할 수 있는 방법을 반드시(MUST) 제공해야 한다.
“VAVAILABILITY” 구성요소로부터 생성된 iCalendar “VFREEBUSY” 정보는 바쁨 또는 자유 시간 구간 외의 정보를 포함해서는 안 된다(MUST NOT). 특히 사용자가 지정한 “SUMMARY”, “LOCATION”, “DESCRIPTION” 같은 속성 값은 free-busy 결과 데이터로 복사되어서는 안 된다(MUST NOT).
[RFC5545], [RFC5546], [RFC4791], [RFC6638], [RFC7809]의 개인정보 고려사항도 반드시 준수되어야 한다(MUST).
10.1. 구성요소 등록
이 문서는 [RFC5545] 8.3.1절에 정의된 레지스트리에 추가된 다음의 새로운 iCalendar 구성요소를 정의한다.
+---------------+---------+------------------------+
| 구성요소 | 상태 | 참고 |
+---------------+---------+------------------------+
| VAVAILABILITY | Current | RFC 7953, 3.1절 |
| AVAILABLE | Current | RFC 7953, 3.1절 |
+---------------+---------+------------------------+
10.2. 속성 등록
이 문서는 [RFC5545] 8.3.2절에 정의된 레지스트리에 추가된 다음의 새로운 iCalendar 속성을 정의한다.
+----------+---------+------------------------+
| 속성 | 상태 | 참고 |
+----------+---------+------------------------+
| BUSYTYPE | Current | RFC 7953, 3.2절 |
+----------+---------+------------------------+
11. 정규 참고문헌
[RFC2119] Bradner, S., “요구 수준을 나타내기 위해 RFC에서 사용하는 키워드”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, 1997년 3월.
[RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault, “WebDAV에 대한 캘린더 확장(CalDAV)”, RFC 4791, DOI 10.17487/RFC4791, 2007년 3월.
[RFC5545] Desruisseaux, B., Ed., “인터넷 캘린더링 및 스케줄링 핵심 객체 명세(iCalendar)”, RFC 5545, DOI 10.17487/RFC5545, 2009년 9월.
[RFC5546] Daboo, C., Ed., “iCalendar 전송 독립 상호운용 프로토콜(iTIP)”, RFC 5546, DOI 10.17487/RFC5546, 2009년 12월.
[RFC6638] Daboo, C. and B. Desruisseaux, “CalDAV에 대한 스케줄링 확장”, RFC 6638, DOI 10.17487/RFC6638, 2012년 6월.
[RFC7809] Daboo, C., “WebDAV에 대한 캘린더 확장(CalDAV): 참조에 의한 타임존”, RFC 7809, DOI 10.17487/RFC7809, 2016년 3월.
부록 A. 예시 캘린더 #1
BEGIN:VCALENDAR CALSCALE:GREGORIAN PRODID:-//example.com//iCalendar 2.0//EN VERSION:2.0 BEGIN:VEVENT DTSTAMP:20111113T044111Z DTSTART;TZID=America/Montreal:20111106T120000 DURATION:PT2H SUMMARY:회의 UID:768CB0C2-8642-43F7-A6C4-F8BB04B829B4 END:VEVENT BEGIN:VAVAILABILITY UID:452DFCA7-3203-4A3D-9A9A-99753A383B41 DTSTAMP:20111005T133225Z DTSTART;TZID=America/Montreal:20111002T000000 BEGIN:AVAILABLE UID:466D5C68-5C4A-4078-AF5D-9C55EA9145D7 SUMMARY:월요일부터 금요일까지 8:00~18:00 DTSTART;TZID=America/Montreal:20111002T080000 DTEND;TZID=America/Montreal:20111002T180000 RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR END:AVAILABLE END:VAVAILABILITY END:VCALENDAR
부록 B. 예시 캘린더 #2
BEGIN:VCALENDAR
CALSCALE:GREGORIAN
PRODID:-//example.com//iCalendar 2.0//EN
VERSION:2.0
BEGIN:VEVENT
DTSTAMP:20111113T044111Z
DTSTART;TZID=America/Denver:20111106T120000
DURATION:PT2H
SUMMARY:덴버에서의 점심 회의
UID:2346C09A-42BF-439E-916C-FC83AF869171
END:VEVENT
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:627A87FA-E5F1-43C0-B3B1-567DA10F2A83
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Montreal:20111002T000000
BEGIN:AVAILABLE
UID:A833E850-892B-43F6-98B6-C15A6BFC5D27
SUMMARY:월요일부터 금요일까지 9:0017:00
DTSTART;TZID=America/Montreal:20111002T080000
DTEND;TZID=America/Montreal:20111002T180000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
LOCATION:몬트리올
END:AVAILABLE
END:VAVAILABILITY
BEGIN:VAVAILABILITY
ORGANIZER:mailto:bernard@example.com
UID:F01411E3-38B8-4490-8A1F-0CCEC57A0943
DTSTAMP:20111005T133225Z
DTSTART;TZID=America/Denver:20111023T000000
DTEND;TZID=America/Denver:20111030T000000
PRIORITY:1
BEGIN:AVAILABLE
UID:A35AA091-3846-48ED-96F6-881E8A0D0A93
SUMMARY:월요일부터 금요일까지 9:0017:00
DTSTART;TZID=America/Denver:20111023T080000
DTEND;TZID=America/Denver:20111023T180000
RRULE:FREQ=WEEKLY;BYDAY=MO,TU,WE,TH,FR
LOCATION:덴버
END:AVAILABLE
END:VAVAILABILITY
END:VCALENDAR
감사의 말
피드백을 제공해 준 다음 분들께 감사한다: Toby Considine, Bernard Desruisseaux, Alexey Melnikov, Daniel Migault, Ken Murchison, Evert Pot, Dave Thewlis.
이 명세는 Calendaring and Scheduling Consortium에서의 논의를 통해 마련되었다.
저자 주소
Cyrus Daboo Apple Inc. 1 Infinite Loop Cupertino, CA 95014 United States of America Email: cyrus@daboo.name URI: http://www.apple.com/
Michael Douglass Spherical Cow Group 226 3rd Street Troy, NY 12180 United States of America Email: mdouglass@sphericalcowgroup.com URI: http://sphericalcowgroup.com/
Daboo & Douglass Standards Track [Page 24]