WebDAV

2011. 12. 17. 19:24개발/서버




웹하드디스크 구현할 수 있고, FTP를 통하지 않고 HTTP 프토토콜을 통해 웹상의 파일을 송수신하고
수정, 삭제할 수 있는 WebDAV 설정과 사용 방법을 설명한다.

1. WebDAV란 무엇인가?

WebDAV는 Web-based Distributed Authoring and Versioning (웹기반 분산형 저작 및 버전관리)의
약자로 웹을 통하여 웹서버에 파일을 관리(목록 조회, 수정, 삭제, 이동 등)할 수 있는 확장된 HTTP
프로토콜을 말한다.

1) WebDAV 특징

- 파일 락킹(file locking) 지원 : 여러 명이 동시 접근이 가능한 웹에서 overwrite하는 것을 막는다.
- XML을 사용하여 데이터를 교환 (물론 사용자는 XML을 몰라도 된다.)
- 설정은 간단하지만 효과는 만점
- 쉬운 접근 제어
- 웹하드디스크 구현 가능

2) WebDAV에서 확장된 메소드(Method)

HEAD, GET, PUT, POST 등의 기본 HTTP 메소드 외에 WebDAV에는 확장된 다음 메소드들이 있다.

 
------------  -------------------------------------------------------------------------
   메소드                                      의  미
------------  -------------------------------------------------------------------------
PROPFIND      리소스를 위한 속성을 검색한다. 즉, 웹의 파일 목록과 속성을 검색한다.
PROPPATCH     하나의 리소스에 대한 속성을 변경한다.
MKCOL         새로운 컬렉션(디렉토리, 폴더에 해당)을 만든다.
COPY          리소스와 컬렉션을 복사한다. 파일 복사
MOVE          리소스와 컬렉션을 이동한다. 파일 이동
LOCK, UNLOCK  리소스에 overwrite 방지를 위한 락을 걸고 푼다.
OPTIONS       서버가 지원하는 메소드를 출력한다.
DELETE        리소스와 컬렉션을 삭제한다. 파일 삭제
------------  -------------------------------------------------------------------------
 


2. WebDAV 사용을 위한 아파치 모듈 설치

1) 아파치 1.3.x에서 mod_dav 설치

* 아파치 1.3.x용 DAV 모듈 : http://www.webdav.org/mod_dav/

위 사이트에서 최신 mod_dav를 받는다. (현재 mod_dav-1.0.3-1.3.6.tar.gz )
아파치는 이미 DSO방식으로 /usr/local/apache에 설치된 것으로 가정하고 mod_dav 모듈을 추가해보자.

 
tar xvfz mod_dav-1.0.3-1.3.6.tar.gz
cd mod_dav-1.0.3-1.3.6
./configure --with-apxs=/usr/local/apache/bin/apxs
make
make install
 


모듈은 /usr/local/apache/libexec/ 디렉토리에 설치될 것이다.

2) 아파치 2.x에서 mod_dav 설치

아파치 2.x에서는 1.3.x에서 별도로 설치해야 했던 모듈이 이미 소스안에 포함되어 있으므로
아파치 설치할 때 configure에서 --enable-dav를 추가한 후 컴파일하면 된다.

 
./configure --enable-dav --기타옵셥들...
.. 생략 ...
checking whether to enable mod_dav... yes (default)
.. 생략 ...
make
make install
 


3) httpd.conf에서 모듈 확인

아피치 1.3.x에서는 httpd.conf에 다음이 있는지 확인하고

 
LoadModule dav_module         libexec/libdav.so
AddModule mod_dav.c
 


2.x에서는 다음을 확인한다.

 
LoadModule dav_module         modules/mod_dav.so
 


3. 아파치 웹서버에서 WebDAV 설정

WebDAV 사용하기 위한 가장 기본적인 설정을 해보자.

 
# DAV의 파일락킹을 위한 Lock DB가 위치할 경로를 지정한다.
# - /tmp/DavLock 이라고 설정할 때 /tmp 디렉토리에 DavLock DB 파일이 생성되는 것이다.
# - 지정한 경로는 반드시 아파치 웹서버의 실행 user(보통 nobody, web, apache 등)가
#   쓰기 가능한 디렉토리여야 한다.
DAVLockDB /tmp/DavLock

# /dav 디렉토리를 WebDAV 사용 가능한 디렉토리로 지정
# - /usr/local/apache/htdocs가 홈디렉토리 일 때
#   /usr/local/apache/htdocs/dav 를 의미한다.
# - 만약 홈디렉토리를 벗어난 곳에 위치한다면 Alias 지시자로 매핑을 해준다.
#   Alias /dav /home/truefeel/work
# - 지정한 디렉토리는 웹서버 실행 user가 쓰기 가능한 권한이 있어야
#   수정, 삭제, 이동, 파일명 변경이 가능하다.
<Location /dav>
    # WebDAV를 사용하겠다
    DAV On

    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Location>
 


위의 설정만 가지고도 '홈디렉토리/dav/' 는 WebDAV를 사용할 수 있는 환경이 된다.
제대로 동작하는지 도저히 못 참겠는 사람은 아파치 웹서버를 재실행하고
'4. WebDAV 클라이언트로 홈페이지 파일을 관리해보자.'으로 넘어가라!

한단계 높혀 해당 디렉토리 접속할 때 인증 과정을 거치고 특정 IP에서만 접속을 허용하도록 설정해보자.
아래 설정은 웹브라우저에서는 일반적인 형태와 동일하게 나타나지만 WebDAV 클라이언트를 통해
접속할 때는 192.168.123.0/24 IP에서만 접근이 가능하고 또한 로긴용 ID와 비밀번호를 물어보게 된다.

 
DAVLockDB /tmp/DavLock
# DAV 파일락킹을 할 최소 시간을 지정한다.
DAVMinTimeout 600

<Location /dav>
    DAV On

    AllowOverride None
    Options None

    # 아파치 인증
    # - 인증용 사용자 파일의 위치는 /usr/local/apache/dav/.htpasswd 이다. 이 파일은
    #   홈디렉토리(/usr/local/apache/htdocs) 밖에 두어 웹에서는 접근할 수 없도록 한다.
    # - WebDAV 확장용 매소드와 PUT, POST(이 또한 WebDAV에서 사용함)에 대해 적용된다.
    # - 192.168.123.0 ~ .255 이외의 곳에서는 WebDAV 접근이 불가능하다.
    # - 인증용 ID는 webdav이며 이 사용자의 비밀번호는 .htpasswd에 설정해둬야 한다.
    AuthName "WebDAV User"
    AuthType Basic
    AuthUserFile /usr/local/apache/dav/.htpasswd
    <Limit PUT POST DELETE PROPFIND PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
       Order deny,allow
       Deny  from all
       Allow from 192.168.123.
       Require user webdav
    </Limit>
</Location>
 


인증용 파일을 생성해보자.

 
mkdir /usr/local/apache/dav
htpasswd -c /usr/local/apache/dav/.htpasswd webdav
New password: 
Re-type new password: 
Adding password for user webdav
chmod 701 /usr/local/apache/dav
chwon root:nobody /usr/local/apache/dav/.htpasswd
chmod 640 /usr/local/apache/dav/.htpasswd
 


 
/usr/local/apache/bin/apachectl restart
 


4. WebDAV 클라이언트로 파일을 관리해보자.

WebDAV Client중에 SkunkDAV 클라이언트를 소개한다.
자바로 개발됐으며, 파일 목록 조회는 물론 자체 편집기가 포함되어 있어 웹상의 파일을
손쉽게 편집할 수 있다. 또한 간단한 이미지 뷰어가 내장되어 있다.

* SkunkDAV DAV 클라이언트 프로젝트 홈페이지 : http://skunkdav.sourceforge.net/

최신 jar 파일(현재 skunkdav-1.0.2.4.jar)을 받아온다.
Java를 사용할 수 있는 환경하에서 다음과 같이 실행한다.

 
java -jar skunkdav-1.0.2.4.jar
 

1) 접속화면

File -> Connect 를 선택하거나 Ctrl+D를 누르면 접속창이 나타난다. 


Connect 버튼을 누른 후에 아무런 변화가 없다면 정상적으로 접속되지 않은 경우이니
접근 권한이 있는 것인지 또는 설정에 문제는 없는 것인지 httpd.conf와 access_log, error_log를
살펴보기 바란다.

2) 로긴

아파치 인증을 설정한 경우에 나타나며 ID와 비밀번호를 입력한다. 


3) 파일 브라우징

- 정상적으로 연결이 되면 아래 화면과 같이 파일 목록을 조회할 수 있다.
  (로컬 파일이 아닌 원격 서버의 웹페이지에 있는 파일을 본 것이다.)
- 오른쪽 버튼을 누르면 복사, 삭제, 이동, 이름변경, 파일 업로드, 다운로드를 할 수 있는
  메뉴가 나온다.
- 파일을 더블 클릭하면 파일 내용을 조회(편집화면으로 넘어감)하거나 이미지 파일이면
  뷰어를 통해 볼 수 있다.
- 사용할 때 주의할 것은 파일을 선택된 상태에서 Delete, Upload를 클릭하면 확인과정없이
  삭제되고 업로드된다. 


위의 화면에서 파일명 옆에 열쇠 모양이 보일 것이다. 바로 파일 락킹이 되었다는 표시이다.
WebDAV 락 파일 DB가 생성됐는지 확인해보자.

 
ls -l /tmp/Dav*
-rw-r--r--    1 nobody   nobody       4096  4월 26 02:03 DavLock.dir
-rw-r--r--    1 nobody   nobody       2048  4월 26 22:32 DavLock.pag
 


만약 DAVLockDB 지시자에서 설정한 디렉토리(위에서는 /tmp)가 웹 user가 쓸 수 없을 경우에는
아파치 error_log에는 다음과 같은 오류 메시지가 남는다.

 
[Mon Apr 21 21:41:40 2003] [error] [client 127.0.0.1] Could not LOCK /dav/index.html due to a failed precondition (e.g. other locks).  [500, #0]
[Mon Apr 21 21:41:40 2003] [error] [client 127.0.0.1] The locks could not be queried for verification against a possible "If:" header.  [500, #0]
[Mon Apr 21 21:41:40 2003] [error] [client 127.0.0.1] Could not open the lock database.  [500, #400]
[Mon Apr 21 21:41:40 2003] [error] [client 127.0.0.1] (13)Permission denied: Could not open property database.  [500, #1]
 


4) 파일 편집

- 파일을 클릭했을 때 자동으로 편집 모드로 들어간다.
- 수정 후 Ctrl+S를 누르면 바로 원격 웹서버에 저장된다.
- HTML, Java, Python 등은 syntax highlighting 기능을 제공한다. 



5) 이미지 뷰어

- 이미지 파일(PNG는 지원하지 않음)을 클릭했을 때 내장 뷰어를 통해 보여준다. 



SkunkDAV 클라이언트 이외에
- jEdit(자바 기반 에디터)에서 DAV 플러그인 ( http://www.jedit.org/ )
- wget 스타일의 툴인 DAVTOOL ( http://davtool.sourceforge.net/ )
등의 툴을 사용해볼 수 있다. 보다 많은 자료는 http://www.webdav.org/ 에서.

5. WebDAV 서버를 마운트해서 사용하기

WebDAV 리눅스 파일시스템인 davfs2는 원격의 WebDAV 서버를 로컬에 마운트해서 사용하도록 해준다.
리눅스 커널의 Coda 파일시스템을 사용하므로 커널 컴파일시에 반드시 'Coda File system support' 를
Y 또는 M(모듈)으로 컴파일해야 한다.

로컬 파일처럼 사용할 수 있는 장점은 있으나 몇 가지 문제가 있다.

- ext3와 Coda 파일시스템간의 문제로 웹페이지가 ext3 파일시스템에 있을 때는 파일 수정, 삭제 등
  변경 기능이 제대로 되지 않을 수 있다.
- 파일 목록을 보기 위해 너무 많은 PROPFIND 매소드를 요청한다. (DoS 공격으로 오해할 수 있음)
- 속도가 느리다. (truefeel의 개인적 견해)

이런 문제점을 있지만 소개하는 것은 개발자가 한국인 김성씨이기 때문이다.

* davfs2 홈페이지 : http://dav.sourceforge.net/

최신 버전(현재 http://osdn.dl.sourceforge.net/sourceforge/dav/davfs2-0.2.1.tar.gz)을 받은 후
일반적인 컴파일 과정으로 설치하면 된다.

 
./configure
... 생략 ...
Using configuration for building DAVFS2 0.2.1:

  Install prefix:  /usr/local
  Compiler:        gcc
  neon library:    included libneon (0.23.5)
  XML parser:      libxml 2.5.4
  SSL library:     No SSL support

Now run 'make' to compile DAVFS2
make
make install (/usr/local/sbin/mount.davfs 설치됨)
 


그럼 마운트 해보자.

 
insmod coda (Coda 파일시스템이 모듈로 있는 경우)
mount.davfs http://192.168.123.100/dav /mnt/dav -ousername=webdav,password=????????
mount
... 생략 ...
/dev/davfs0 on /mnt/dav type coda (rw,host=http://192.168.123.100/dav/)
 


마운트 경로를 잘 못 지정한 경우 다음 오류가 발생한다.

unmounting dav device. [Maybe unmounted]: No such file or directory
/dev/davfs0: No such file or directory

커널에서 Coda 파일시스템을 지원하지 않거나 모듈을 로딩하지 않은 경우 다음 오류가 발생한다.

Error opening /dev/davfs0. Error no = 19
Probably, your kernel dosen't support Coda.

6. 참고 자료

* WebDAV 리소스 ( WebDAV 자료 찾는 것은 이 사이트 부터 시작하면 된다. )
  http://webdav.org/
* Apache 1.3.x용 mod_dav 모듈 설치와 환경 설정
  http://www.webdav.org/mod_dav/install.html
* Apache mod_dav 설정
  http://httpd.apache.org/docs-2.0/ko/mod/mod_dav.html
* 자바로 만들어진 WebDAV 클라이언트 SkunkDAV
  http://skunkdav.sourceforge.net/
* WebDAV용 리눅스 파일시스템 (davfs2)
  http://dav.sourceforge.net/
* WEB Server 읽고 쓰기 (WEB-DAV) (글 김성훈)
  http://kltp.kldp.org/stories.php?story=01/06/29/6818804 











'개발 > 서버' 카테고리의 다른 글

VSFTP  (1) 2011.12.21
네트워크 상태 보기! - TCP View 편 (1)  (0) 2011.12.18
[Linux] 쉘 Shell 이란? & 심볼릭 링크 변경  (0) 2011.12.17
데이터 파일경로 php 스크립트 막기  (0) 2011.12.17
아파치 로그분석  (0) 2011.12.17