연결 훅은 세션 정책이지 패킷 필터가 아니다
클라이언트 연결 훅은 세션마다 한 번 실행되고 페이로드를 결코 보지 않는다. 허용은 세션이 있는 곳에, 콘텐츠 변경은 요청이 있는 곳에 두라.
누군가 클라이언트가 터널을 통해 무엇을 보내는지 살펴보려다 문서에서 연결 훅을 발견하고, 패킷을 단 하나도 받지 못할 스크립트를 쓰기 시작한다. 훅은 실재하고 유용하지만, 그 작업 단위는 바이트가 아니라 세션이다. 올바른 구성 요소를 고르는 일은 작업이 일어날 수 있는 세 곳을 비교하는 것이며, 결정적인 질문은 각각이 실제로 어느 단위를 볼 수 있느냐이다.
훅이 받는 것과 결코 받지 못하는 것
클라이언트 연결 훅은 인증된 클라이언트가 세션을 수립할 때 서버의 프로세스 문맥에서 한 번 실행되며, 문서화된 인자와 공통 이름, 할당된 주소 같은 환경 값을 받는다. 클라이언트별 구성을 쓰고, 허용 결정을 내리고, 외부 자원을 할당하거나, 연결이 일어났음을 기록할 수 있다. 할 수 없는 것은 트래픽을 관찰하는 일인데, 첫 패킷이 터널을 건널 무렵 훅은 이미 반환했기 때문이다.
이것은 우회해야 할 제약이 아니다. 스트림을 처리하려는 세션 콜백은 연결의 수명 내내 실행되어야 하며, 데몬의 스크립트 계약은 그런 형태를 위해 만들어지지 않았다. 훅이 방해된다고 판단하기 전에 무엇을 위한 것인지 물어야 한다.
재연결도 중요하다. 끊겼다가 다시 연결하는 클라이언트는 새 세션이므로, 훅이 할당하는 모든 것은 멱등이거나 정리하는 연결 해제 이벤트와 짝을 이뤄야 한다. 재연결마다 새는 상태는 훅 기반 설계에서 흔한 첫 번째 버그다.
세션 정책은 훅 안에 있다
허용은 훅의 자연스러운 일이다. 누가 어디서 어떤 인증서로 연결했는지 알고 있고, 이 세션을 진행시킬지 거부할지 결정할 수 있다. 그 결정은 저렴하고 한 번 일어나며, 페이로드의 바이트 하나도 볼 필요가 없다.
구성 할당도 같은 형태에 맞는다. 훅은 클라이언트의 주소를 고르고, 그 신원에 맞는 옵션을 밀어 넣고, 서버가 이 클라이언트를 위해 읽는 조각을 쓸 수 있다. 결정이 세션 단위이므로, 무언가 잘못되어 특정 클라이언트가 특정 주소를 받은 이유를 누군가 설명해야 할 때도 이해 가능한 상태로 남는다.
기록은 세 번째 적합성이다. 세션이 허용되었음을 그 신원과 시각과 함께 말하는 감사 항목은 바로 여기에 속한다. 그것은 트래픽 로그가 아니며 그런 척해서도 안 된다. 나중에 누군가 클라이언트가 터널 안에서 무엇을 했는지 묻는다면, 답은 다른 곳에서 와야 한다.
패킷 작업은 패킷 경로에 속한다
날아가는 바이트를 보거나 바꾸는 것이 요구 사항이라면, 구성 요소는 전달 경로에 있어야 한다. 대기열이 있는 방화벽 규칙, 트래픽 제어 훅, 또는 사용자 공간의 포워더다. 그런 메커니즘은 패킷을 보며, 저마다의 상태와 실패 방식과 성능 특성을 갖는다.
그 계층에서 페이로드를 편집하는 것은 읽는 것보다 어렵다. 한 바이트를 바꾸면 길이 필드, 체크섬, 프로토콜 상태 기계가 무효가 될 수 있고, 삼 계층 터널은 그 어느 것도 막아 주지 않는다. 다만 편집하는 대상이 바깥 헤더가 아니라는 뜻일 뿐이다. 누군가에게 콘텐츠 재작성을 약속하기 전에 그 복구 작업을 예산에 넣어야 한다.
인터페이스 캡처는 이 범주에서 가장 값싼 도구이며, 편집자가 아니라 관찰이다. 둘 다 트래픽을 본다고 설명되기에 혼동하기 쉽지만, 캡처는 파일을 만들고 패킷 경로는 결정을 만든다.
애플리케이션 변경은 애플리케이션에 속한다
요청이 무엇을 담는지, 또는 응답이 어떻게 형성되는지를 바꾸는 것이 목표라면, 올바른 자리는 서비스 자체이거나 프로토콜을 의도적으로 종료하는 프록시다. 그런 구성 요소는 이미 요청과 응답, 그리고 애플리케이션이 기대하는 인증을 이해하며, 그것이 바로 패킷 필터에 없는 문맥이다.
주소 변환이 이 목록의 맨 아래에 있는 데는 이유가 있다. 주소와 포트를 다시 쓰고 페이로드는 건드리지 않으므로, 콘텐츠를 언급하는 레시피에 아무리 자주 등장해도 콘텐츠 도구가 아니다.
이 경계들을 분리해 두는 것이 설계를 설명 가능하게 만든다. 훅 안의 세션 정책, 패킷 경로에서의 패킷 처리, 그리고 프로토콜이 의도적으로 종료되는 곳에서의 애플리케이션 변경. 이 세 문장은 검토용 체크리스트로도 쓰인다.
TLS가 여전히 대화를 끝내는 곳
위의 모든 것을 견디는 것이 하나 있다. 터널 안에서 HTTPS를 실어 나르는 트래픽은 자체 전송 암호화를 유지한다. VPN의 키를 가진다고 해서 얻는 것은 내부 IP 패킷이며, 반대편 웹사이트의 세션 키는 얻지 못한다.
그래서 훅은 원리상으로도 콘텐츠를 검사할 수 없고, 그래서 배포가 의도적으로 내부 TLS를 종료하지 않는 한 패킷 경로가 보는 것은 암호문이다. 스크립트 계약 훅에 무엇이 주어지는지 설명한다. 페이로드에 대해서는 아무 말도 하지 않는데, 줄 페이로드가 없기 때문이다.