FrontPage(FrontPage Server Extentions, FPSE)
어디서든 배포한다
- 서버 측 소프트웨어 제품군
- 서버측 컴포넌트 + 웹 서버
- 웹 사이트와 FrontPage를 구동시키는 클라이언트(이 확장 지원 클라이언트) 사이에서 필요한 변환 작업 수행
- FP 클라이언트와 FPSE 사이에서 사용하는 배포 프로토콜
FrontPage 배포 프로토콜
- HTTP POST 요청 위에 RPC 계층 구현
- 웹 사이트 문서 갱신, 검색 수행, 웹 개발자들 간 공동 작업
- FP 클라이언트가 서버에 명령을 보냄
FrontPage RPC
RPC 메서드와 그와 관련한 변수를 POST 요청의 본문에 기술해서 HTTP POST를 감싼다.
- 통신 시작
- 서버에 있는 대상 프로그램의 이름과 위치 결정
- 특별한 GET 요청을 보냄 ⇒ POST 요청을 보낼 위치를 얻어낸다.
- FPShtmlScriptUrl - 탐색 시간에 관한 요청
- FPAuthorScriptUrl - 저작 시간 명령에 관한 요청
- FPAdminScriptUrl - 관리 동작
위치를 알아냈으니 이제 POST 요청을 보낼 수 있다
요청
- : 메서드 내 빈칸 표현


응답
웹 서버에서 유효한 문서의 목록을 특정 형식에 맞추어 작성해 FP 클라이언트에 반환한다.
보안 아키텍처

- 관리자, 저작자, 사용자의 목록은 특정 FPSE 확장 웹에 따라 다르게 정의된다.
- 모든 서브웹은 루트웹에서 권한을 상속받거나 자체 권한이 있다.
IIS 서버 - 통합된 윈도우 보안 모델 적용
- 권한 검사 : 주어진 루트나 서브루트에 대한 ACL(Access Control List)을 보고 검사
- 요청을 받으면, 로그인하고 사용자로 가장한 다음, 세 개의 DLL 중 하나에 요청을 보낸다
- DLL은 목적지 폴더에 정의된 ACL을 기준으로 가장된(impersonation) 사용자가 권한이 있는지 검사한다.
- 검사 성공 → 요청된 동작은 확장 DLL을 통해 실행된다.
- 실패 → 승인 거부(permission denied) 메시지 반환
- 윈도우 전용 보안 애플리케이션 User Manager
IIS가 아닌 웹 서버
- 모든 FPSE 프로그램이 “executable” 표시가 된 디렉터리에 저장되어야 함.
- Fpsrvadm : FrontPage 서버 관리 유틸리티
- 프로그램 접근 허가된 사용자들을 따로 기술함.
- 아파치, NCSA → .hataccess 파일, 넷스케이프 → .nsconfig
- GET, POST 등 다양한 권한 등급의 사용자, 그룹, IP 주소 기술됨
WebDAV
Web Distributed Authoring and Versioning
- 새로운 HTTP 메서드 집합 정의, 몇몇 http 메서드의 동작 범위 수정
메서드
- 추가된 메서드
- PROPFINE : 리소스의 속성을 읽는다.
- PROPPATCH : 한 개 이상의 리소스에 대해 한 개 이상의 속성을 설정한다.
- MKCOL : 콜렉션을 생성한다.
- COPY : 특정 원본지에서 특정 목적지로 리소스나 리소스의 집합을 복사한다.
- MOVE : 특정 소스에서 특정 목적지에 리소스나 리소스의 집합을 이동시킨다.
- LOCK : 하나 이상의 리소스를 잠근다.
- UNLOCK : 기존에 잠겨있는 리소스를 잠금 해제한다.
- 수정된 메서드
- DELETE, OPTIONS, PUT
- XML
XML(Extensible Markup Language) 지원
- 구조화된 데이터를 표현할 때 사용하는 포맷. 메타 마크업 언어
- 전통적으로 DTD(Document Type Definition) 준수
- XML 문서를 해석하려고 할때, 해당 XML 문서와 연관된 DTD 파일의 이름을 제공함.
헤더
DAV : WebDAV를 제공하는 서버와 통신할 때 사용.
- 지원하는 모든 리소스는 OPTIONS 요청에 대한 응답에 이 헤더를 포함해야 함.
Depth : 여러 수준의 계층 구조로 분류된 리소스에 WebDAV를 사용하기 위한 중요한 요소
- LOCK, COPY, MOVE 수정
Destination : COPY나 MOVE 메서드가 목적지 URI를 식별하는데 쓰임
- Destination = “목적지” “:” 절대 URI
잠금
배타적 쓰기 잠금 vs 공유된 쓰기 잠금
- 배타적 쓰기 - 잠금 소유자만 쓰기 가능
- 공유된 쓰기 - 그룹이 잠금을 소유함

LOCK 메서드
LOCK /docs/myfile.doc HTTP/1.1
Host: www.contoso.com
Timeout: Infinite, Second-4100000000
Content-Type: text/xml; charset="utf-8"
Content-Length: XXXX
Authorization: Digest username="user",
realm="user@contoso.com", nonce="...",
uri="/docs/myfile.doc",
response="...", opaque="..."
<https://www.contoso.com/~user/contact.htm>
- <locktype> : 잠금 형식을 나타냄. 현재는 “쓰기” 하나뿐
- <lockscope> : 배타적 잠금인지 공유된 잠금인지
- <owner> : 현재 잠금을 누가 갖고 있는지 알려주는 필드
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Fri, 10 May 2002 20:56:18 GMT
Content-Type: text/xml
Content-Length: 419
<?xml version="1.0"?>
<a:prop xmlns:a="DAV:">
<a:lockdiscovery><a:activelock>
<a:locktype><a:write/></a:locktype>
<a:lockscope><a:exclusive/></a:lockscope>
<a:owner xmlns:a="DAV:"><a:href>AutherA</a:href></a:owner>
<a:locktoken><a:href>opaquelocktoken:*****</a:href></a:locktoken>
<a:depth>0</a:depth>
<a:timeout>Second-180</a:timeout>
</a:activelock></a:lockdiscovery>
</a:prop>
- <lockdiscovery> : 잠금 정보 컨테이너
- <activelock> : 요청에 보내진 정보 <locktype>, <lockscope>, <owner>
- <locktoken>
- <depth> : Depth 헤더와 동일한 역할
- <timeout> : 잠금 타임아웃 설정. 위의 예시에서는 180초
opaquelocktoken scheme
유일성 보장 → UUID
- 각 LOCK 요청마다 uuid를 생성하거나, 싱글 UUID를 생성하고 끝에 추가적인 문자 추가
- 후자가 좋은 방법인데, 추가되는 문자 재사용 안한다는 보장 필요
<lockdiscovery> XML 요소
<lockdiscovery> XML 요소는 활성 잠금 검색을 위한 메커니즘을 제공한다. 잠금이 설정된 상태에서 다른 사용자가 파일을 잠가려고 하면 현재 소유자를 나타내는 <lockdiscovery> XML 요소를 받게 됩니다. <lockdiscovery> 요소는 모든 미결 잠금과 속성을 나열한다.
To completely solve it, a cooperative event system with a versioning control is needed.
UNLOCK
리소스의 잠금을 제거함.
UNLOCK /ch-publish.fm HTTP/1.1
Host: minstar.inktomi.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Lock-Token:
opaquelocktoken:*********
HTTP/1.1 204 OK
Server: Microsoft-IIS/5.0
Date: Fri, 10 May 2002 20:56:18 GMT
WebDAV는 성공적인 UNLOCK 수행을 위해 다음과 같은 사항을 요구한다.
- 다이제스트 인증 성공
- Lock-Token 헤더 속 lock token 매칭

속성, META 데이터
속성
- 저작자 이름
- 수정한 날짜
- 내용 등급
→ 리소스의 정보 기술
HTML의 META 태그
- 콘텐츠 일부로써 그 정보들을 포함하는 메커니즘 제공
- 많은 리소스들이 META 데이터에 포함될 수 없음.
- 바이너리 데이터
분산 협업 시스템 like WebDAV
- 더 복잡한 속성
- 문서 편집 → 새로운 저작자를 반영, 갱신
- 동적 수정 속성 : ‘live’ 속성
- Content-Type과 같은 정적 속성 : ‘dead’ 속성
PROPFIND
- property find
PROPFIND /ch-publish.fm HTTP/1.1
Host: minstar.inktomi.com
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT)
Depth: 0
Cache-Control: no-cache
Connection: Keep-Alive
Content-Length: 0
<d:**propertyupdate** xmlns:d="DAV:" xmlns:o="<http://name-space/scheme/>">
<d:**set**>
<d:prop>
<o:owner>Author A</o:owner>
</d:prop>
</d:set>
<d:**remove**>
<d:prop>
<o:owner/>
</d:prop>
</d:remove>
</d:propertyupdate>
- <propertyupdate> : PROPPATCH 메서드의 기본 XML 요소. 업데이트가 필요한 모든 속성을 담는 컨테이너 역할
콜렉션과 이름공간 관리
콜렉션 : 사전에 정의한 계층에 있는 리소스들의 논리적 혹은 물리적 그룹.
- 예: 디렉터리 → 파일시스템의 디렉터리 같이 다른 리소스들의 컨테이너처럼 동작
- 콜렉션은 다른 콜렉션을 포함함
MKCOL
클라이언트가 지정된 URL에 해당하는 콜렉션을 서버에 생성하게 한다.
- PUT이나 POST로 추가적인 정보를 더해 보는 식으로 즉석에서 프로토콜 생성 → 번거롭고 오류 발생
- 콜렉션이 이미 존재 → 405 Method Not Allowed
- 쓰기 권한이 없음 → 403 Forbidden
- MKCOL /colA/colB 같은 요청을 보냈는데 colA가 존재하지 않음 → 409 Conflict
COPY, MOVE
대안 : 리소스에 GET 요청을 보내고, 리소스를 다운받은 다음, PUT 요청과 함께 서버에 리소스를 다시 올림.
- MOVE도 유사한 방식의 대안이 있음.
- 다단게 콜렉션에 대한 COPY, MOVE 작업 시 확장이 쉽지 않다.
원본의 위치 정보 = 요청 URL
목적지 정보 = Destination HTTP 헤더
MOVE의 추가 작업
- 원본지 URL을 목적지에 복사
- 새로 생성된 URI 무결성 검사
- 원본 삭제
{COPY,MOVE} /publishing HTTP/1.1
Destination:
Depth: infinity
Overwrite: T
Host: minstar
HTTP/1.1 201 Created
Server: Microsoft-IIS/5.0
Date: Wed, 15 May 2002 18:29:53 GMT
Location: <http://minstar.inktomi.com/pub-new/>
Content-Type: text/xml
Content-Length: 0
- Depth가 0이면 콜렉션을 복사하거나 이동할 경우, 원본의 속성과 같은 속성을 갖고 있는 콜렉션들만 목적지에 생성될 것임.
- Overwrite 헤더 - T or F 표현
잠긴 리소스 → 목적지로 잠겨있는 리소스 이동 or 복사 금지
- 잠겨 있는 콜렉션 아래 목적지 → 복사 혹은 이동된 리소스도 잠금 처리
- COPY 작업이 완료되면 /publishing은 lock1로 잠긴 상태를 그대로 유지, publishing-old는 lock2로 이미 잠겨져 있던 콜렉션 밑으로 옮겨진 덕에 lock2 잠금이 추가될 것임.
- MOVE → publishing-old는 lock2잠금에 추가됨
'HTTP' 카테고리의 다른 글
HTTP 완벽 가이드 (21) (0) | 2025.03.18 |
---|---|
HTTP 완벽 가이드 (20) (0) | 2025.03.18 |
HTTP 완벽 가이드 (18) (0) | 2025.03.18 |
HTTP 완벽 가이드 (17) (0) | 2025.03.18 |
HTTP 완벽 가이드 (16) (0) | 2025.03.18 |