요약
CLOSE는 이중 명령이었습니다. Selected 상태를 벗어나면서 동시에\Deleted표시가 붙은 모든 메시지를 영구 삭제합니다. 효율을 위해 메시지마다EXPUNGE응답을 보내지 않았습니다.- RFC 3691에서 정의된
UNSELECT는 연결을 Authenticated 상태로 되돌리고 메시지를 삭제하지 않고 메일함 자원을 해제했습니다. 상태 기계에서 같은 목적지를 향한 두 결정이 서로 다른 동사를 갖게 된 것입니다.
메일 프로그램이 Inbox 작업을 마칩니다. 아직 다른 작업을 할 예정이므로 인증은 유지하고 싶지만, 서버가 선택된 메일함 컨텍스트를 더는 유지할 필요는 없습니다. 어떤 삭제도 확정할 생각은 없습니다.
그 의도를 설명하는 것처럼 보이는 명령은CLOSE였습니다. 그러나 쓰기 가능한 선택 메일함에서 그 효과는 컨텍스트를 닫는 데 그치지 않았습니다. 서버는 이미\Deleted표시가 있는 모든 메시지를 영구적으로 제거한 뒤에야 연결을 Authenticated로 되돌렸습니다.
표시는 긴 세션 동안 쌓였을 수 있습니다. 다른 클라이언트가 일부를 바꿨을 수도 있습니다. 사용자는 아직 결정을 고민 중일 수도 있습니다. 그럼에도 출구라는 겉보기 행정 행위는 그 전체 집합에 최종 효력을 부여하는 시점이 되었습니다.
RFC 3691은 2004년에 결여된 의도를 표현하기 위해UNSELECT를 도입했습니다. 이 명령은 선택된 메일함의 자원을 해제하고CLOSE와 동일한 상태 전이를 수행하지만, 본질적인 차이가 하나 있습니다. 어떤 메시지도 영구 삭제하지 않습니다.
개선은 메일 관리 방식을 하나 더 추가한 것이 아니었습니다. 단지 작업 컨텍스트를 반납하려는 사람에게 파괴 권한을 요구하던 관행을 없앤 것이었습니다.
Selected 상태에는 비용과 의미가 있었다
인증된 IMAP 연결은 메일함을 알 수 있지만, 메시지를 검색하거나 가져오거나 플래그를 변경하거나 복사하거나 삭제 작업을 수행하려면 하나를 선택해야 합니다. Selected 상태에 들어가면 클라이언트와 서버는 구체적인 컨텍스트를 공유합니다. 서버는 정보를 유지하고 그 메일함과 관련된 변경 사항을 전달할 수 있습니다.
그 컨텍스트를 벗어나는 것이 연결 종료를 의미하지는 않습니다. 클라이언트는 다른 메일함으로 이동하거나 인증된 상태에서 기다릴 수 있습니다. 따라서 Selected에서 Authenticated로의 전이는 그 자체로 합법적인 작업입니다. 세션 신원을 바꾸지 않고 자원을 해제하고 살아 있는 상태를 줄입니다.
IMAP 상태 다이어그램은 그 전이를CLOSE에 배정했습니다. 그러나 다이어그램은 출발점과 도착점을 요약할 뿐, 어떤 간선이 영속 데이터에 무엇을 하는지는 항상 보여주지 않습니다. 두 명령이 Authenticated로 끝나면서도 서로 다른 메일함을 남길 수 있습니다.
\Deleted표시도 이미 완료된 소멸과 동일하지 않습니다. 메시지가 expunge를 기다리는 상태임을 나타낼 뿐입니다. 그 작업이 실행되는 순간에만 되돌릴 수 없는 경계를 넘습니다. 이 분리 덕분에 표시하고, 검토하고, 나중에 확정할 수 있습니다. 표시와 그 확정이 서로 다른 시점이나 행위자에게서 올 수도 있습니다.
닫기와 expunge를 하나로 묶으면서CLOSE는 마지막 행위자가 발견한 모든 표시에 대한 권한을 물려받게 만들었습니다.
전선 위의 메시지가 줄었다고 삭제가 준 것은 아니었다
EXPUNGE명령은 표시된 메시지를 삭제하고 각 제거마다 비태그 응답을 하나씩 발신합니다. 응답은 선택된 뷰 내 위치인 메시지 시퀀스 번호를 사용합니다. 메시지가 사라지면 그 뒤의 메시지들이 번호를 옮기고, 알림 열은 그 이동을 따라갈 수 있게 합니다.
CLOSE는 이 개별 알림들을 생략합니다. 설계에는 운영상 이유가 있었습니다. 메일함을 곧 떠날 클라이언트는 새 위치를 사용하지 않을 것입니다. 삭제가 많을 때 버려질 응답들을 피하면 상당히 빨라질 수 있습니다.
그 최적화는 전선 위의 증거를 줄였을 뿐, 저장소에 미치는 효과를 줄이지 않았습니다. 태그된OK는 명령이 끝났다는 것은 증명하지만 무엇이 지워졌다는 것은 증명하지 않습니다. 제거된 UID 목록도 제공하지 않습니다. 조사가 명령과 결과만 보존한다면, 닫기가 성공했다는 사실은 알 수 있어도 영향받은 집합을 재구성할 수는 없습니다.
모드 조건도 있습니다.EXAMINE으로 열었거나 다른 방식으로 읽기 전용으로 선택된 메일함에서는CLOSE가 메시지를 삭제하지 않으며, 그렇지 않아도 오류를 내지 않습니다. 같은 이름과 같은 성공 형태가 영구 변경을 의미할 수도, 어떤 변경도 아닐 수도 있습니다.
유용한 증거는 메일함, 모드, 사전 표시 집합, 보존이 정당할 때의 안정 식별자, 선택된 명령, 결과 수신을 함께 연결해야 합니다.closed=true는 중요한 질문에 답하지 않습니다.
비파괴 출구는 이미 존재했지만 표현이 나빴다
IMAP4rev1에서는CLOSE를 먼저 실행하지 않고도 다른 메일함을 select 또는 examine하거나LOGOUT을 보낼 수 있었습니다. 그 경로들은 expunge 없이 현재 선택을 종료했습니다. 즉, 프로토콜이 모든 출구가 삭제를 강제하는 것은 아니었습니다.
현재 메일함을 해제하고 다른 메일함을 선택하지 않은 채 인증 상태로 머무는 직접적인 연산이 없었습니다. RFC 3691은 두 가지 우회를 문서화했습니다. 클라이언트는 존재하지 않는 메일함을 선택 시도하고 그 실패를 이용해 Authenticated로 돌아올 수 있었습니다. 또는 같은 메일함을EXAMINE으로 다시 선택할 수도 있었습니다.
첫 번째 방법은 오류 응답을 평상시 흐름으로 만듭니다. 로그는 의도와 착오를 섞고, 실패 지표는 정밀도를 잃으며, 미래 구현은 무의미해 보이던 경계를 바꿀 수 있습니다. 두 번째는 읽기 전용 뷰를 열어 다른 뷰를 버리는 방식인데, 클라이언트가 실제로 어느 뷰도 유지하길 원하지 않더라도 그렇게 됩니다.
두 경로 모두 다른 목적의 명령이 낳는 부작용을 이용했습니다. 동작은 했지만 수신자와 운영자가 전선 위에 한 번도 나타나지 않은 의도를 추론하게 만들었습니다.
UNSELECT는 그 의도를 읽을 수 있는 명령으로 만들었습니다. 선택을 중단하고, 인증을 유지하고, expunge하지 않는 것입니다.
capability가 호환성을 제한했다
확장을 이해하는 IMAP4rev1 서버는UNSELECTcapability를 광고했습니다. 클라이언트는 사용 전에 어휘를 확인할 수 있었습니다. 알려지지 않은 명령에 대한 거부는 안전한 출구와 동등하지 않았습니다. 서버는 여전히 Selected 상태이며 자원을 유지할 수 있었습니다.
이 협상은 버전, 제조사, 과거 동작을 추측하는 일을 피하게 했습니다. 사용자를 인증하거나 메시지를 검증하지 않습니다. 다만 양쪽 끝이 이 명령에 축소된 동일한 의미를 부여한다는 것만 확정합니다.
UNSELECT는 인수를 받지 않고 특정 비태그 응답도 필요로 하지 않습니다. 성공하면 태그된 결과가 옵니다. 그 보장은 긴 목록에 의존하지 않습니다. 정의 자체가 영구 제거를 배제한다는 사실에 의존합니다.
응답이 유실되면 클라이언트는 상태를 불확실한 것으로 다루고 회복해야 합니다. 그러나 명령 자체는 삭제를 반복하지 않습니다. 권한을 줄이면 중단 이후 재시도가 만들 수 있는 피해 반경도 줄어듭니다.
결정 지점을 보존하는 것은 영구 보존을 약속하는 것이 아니다
UNSELECT는\Deleted를 제거하지 않고, 이미 expunge된 메시지를 되살리지 않으며, 표시를 만든 행위자를 식별하지 않습니다. 메일함이 다시 선택되면 표시는 그대로 남아 있을 수 있습니다. 이후의EXPUNGE,CLOSE또는 다른 권한 있는 작업이 그것들을 확정할 수 있습니다.
이 명령은 결정을 다른 시점을 위해 보존할 뿐, 메시지가 영원히 존재해야 한다고 결정하지 않습니다. 동시 세션을 막지도 않고 인가 규칙을 대체하지도 않습니다. capability 광고는 프로토콜 의미론을 증명할 뿐, 인터페이스의 올바름, 복제본의 존재, 기록의 무결성을 증명하지 않습니다.
정밀함은 허위 안심을 막습니다. 약속은 좁고 검증 가능합니다.UNSELECT로 Selected를 벗어나면 그 명령 때문에 expunge가 실행되지 않는다는 것입니다.
IMAP4rev2는 수정을 기본 언어로 만들었다
RFC 9051은UNSELECT를 IMAP4rev2의 핵심 명령 집합에 포함했습니다. 그 모델은CLOSE와UNSELECT를 Authenticated로의 전이로 열거합니다. 정의는 데이터 차이를 유지합니다. 쓰기 가능한 메일함에서CLOSE는 표시된 모든 메시지를 삭제하고,UNSELECT는 하나도 삭제하지 않습니다.
확장에서 기본 프로토콜로의 전환은 호환 가능한 수리를 보여줍니다. 이전 우회들이 역사에서 지워지지는 않았지만, 흔한 의도는 이제 우회적 실패나 인위적 선택에 의존하지 않습니다. 코드는 어떤 결정이 내려지는지 보여줄 수 있고, 관찰은 그것을 보존할 수 있습니다.
이 패턴은 많은 시스템에 나타납니다. 커밋 후 닫기와 롤백 후 닫기는 연결 상태를 똑같이 남기지만, 데이터는 그렇지 않습니다. 버퍼를 쓴 뒤 파일을 해제하거나 버린 뒤 해제하는 것은 디스크립터 상태를 똑같이 남기지만, 내용은 그렇지 않습니다. 최종 상태만 측정하면 정반대 결과를 낸 작업을 혼동하게 됩니다.
UNSELECT는 최소 명령 원칙을 명시적으로 만들었습니다. 자원 해제 요청이 우연히 삭제 권한을 부여하지는 않습니다. 되돌릴 수 없는 경계를 넘으려면 클라이언트가 그렇게 말하는 명령을 골라야 했습니다.
확인을 잃으면 위험의 종류가 달라졌다
서버가 명령을 받은 뒤 클라이언트가 태그된 결과를 보기 전에 연결이 끊길 수 있습니다.UNSELECT이후의 주된 의문은 선택이 아직 살아 있는지 여부입니다.CLOSE이후에는 이미 실행된 영구 삭제가 존재할 수도 있습니다. 마지막 방법을 자동으로 반복하는 것은 중립적이지 않습니다.
회복은 재접속하고, 메일함을 관찰하고, 존재하는 UID를 이전 증거와 비교한 뒤에야 사람의 의도를 재현해야 합니다. 라이브러리도 차이를 드러내야 합니다. 범용 닫기 함수가 소멸자나 정리 블록 안에 삭제 커밋을 숨겨서는 안 됩니다.
OK만으로 목록을 얻지 못합니다. 동사를 분리한 이점은 효과의 종류를 명령을 보내기 전에, 아직 검토할 수 있는 시점에 알 수 있고, 최소한의 응답을 받은 뒤에 추론할 필요가 없다는 것입니다.
출처
회원 브리핑
프로필 심층 컨텍스트
올바른 멤버십 등급으로 로그인하면 전체 브리핑과 출처 노트를 볼 수 있습니다.
Strategic Circle 전용
Strategic Circle
모든 독자에게 공개됩니다. 가입 후 로그인하면 프로필 브리핑를 열람할 수 있습니다.
Strategic Circle 가입하기Leadership Alliance 전용
Leadership Alliance
자격을 갖춘 IP 자산 소유자 및 운영진을 위한 콘텐츠입니다. 로그인하면 Leadership Alliance 브리핑을 열람할 수 있습니다.
Leadership Alliance 가입하기





