메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

한빛랩스 - 지식에 가능성을 머지하다 / 강의 콘텐츠 무료로 수강하시고 피드백을 남겨주세요. ▶︎

IT/모바일

Web-HardDisc의 구현 원리에 관한 Case Study

한빛미디어

|

2004-04-09

|

by HANBIT

15,956

저자: 임영규 / GNOME 리눅스 기술 연구소


1. 소개

최근 인터넷 웹 디스크에 대한 관심과 사용이 많아지고 있다. 이러한 웹 하드는 어떻게 구현하는 것인지 살펴보기로 한다. 웹 하드란 인터넷상의 FTP 서버에 사용자의 파일을 업로드 및 다운로드하기 위한 목적을 가지는 기능이라고 하겠다. 물론 최근에는 이러한 웹 하드의 상호 공유를 통한 공간 모으기 기능까지도 포함한 발전단계로 접어들었으며 이 또한 사용되고 있는 추세이다. 이러한 웹 디스크를 어떻게 구현되는지 그 원리에 대하여 알아보자.


2. 구현

웹 하드를 구현하는 방법은 여러 가지가 있지만, 일반적으로 많이 사용하는 PHP 스크립트 언어를 사용하여 그 구현 원리를 알아본다. 웹 디스크는 크게 서버와 클라이언트 측면으로 나우어 볼 수 있다. 서버는 FTP 서버, 즉 wu-ftp, ftp-serverU, vsftp, proftp등의 서버 프로그램을 이용하면 되며, 사용자의 디스크 할당 용량을 위한 용량제한 기능을 FTP서버에 설정하면 되겠다. PHP에서는 FTP관련 함수를 제공하는데 이것으로 로그인, 업로드, 다운로드 등을 구현 할 수 있다.


2.1 웹 하드의 원리 도식


[그림 ] 웹 하드 원리



이번 웹 하드의 구현은 리눅스 서버와 VSFTP 서버로 웹 하드의 서버를 구현한다. 그리고 사용자 계정을 만들고 사용자에게 분배할 디스크 용량을 정하기로 한다. 이로써 서버에 대한 설정은 완료된다. 물론 접근 권한은 여러분이 의도하는 대로 설정하면 되겠지만 755로 설정하면 되겠다. 클라이언트 측면에서 생각해 보면 일반적으로 ftp 클라이언트 프로그램을 사용하면 되겠다.

또는 윈도우의 경우 네트워크에서 네트워크 디스크 추가하기 기능을 이용 할 수 있겠다. 그러나 웹 기반으로 실행되는 만큼 ftp 클라이언트를 사용하면, 웹 하드가 아닌 단순히 ftp로 볼 수 있기 때문에 PHP 스크립트와 HTML의 기능을 이용하여 사용한다. 이것이 웹 하드 개념에 더 가깝다고 생각된다. HTML의 mmlt;input type=file ..... mmgt;부분이 파일 업로드 하는 방법이다.

ftp 서버에 있는 파일을 mmlt;a href=file.fextmmgt;file-name mmlt;/ammgt;의 형태로 지정하여 클릭하면 다운로드가 되는 것이다. 이를 위해서 약간의 기교를 더 표현하고자 한다면 자바 스크립트 등의 도움을 받아 웹 페이지를 화려하게 만들 수 있다고 본다. 다음은 웹 하드를 사용하기 위한 PHP 코드를 싣는다. 예제 코드는 www.php.net의 FTP 함수 중의 일부이다. ftp에서 사용하는 몇 개의 함수를 이용하므로 구현하기는 그다지 어렵지 않다고 본다.

중요한 것은 [그림 1]에서 인터넷가 ftp서버가 곧 바로 데이터를 주고 받는 것으로 되어 있는데 사실은 이들 사이에 웹 서버가 관여하게 된다. 따라서 웹 서버는 nobody 또는 apache 계정을 사용하지 않고 ftp 서버에 접근 가능한 사용자 계정으로 접근하는 것이다. 일반적으로 웹 서버에서 특정 파일에 대한 I/O을 수행하는 경우는 모두 웹 서버의 기본 사용자 및 그룹으로 접근한다.

이런 경우 해당 파일에 대하여 read는 가능하지만 write는 불가능하다. 이러한 점을 극복하기 위하여 PHP의 ftp 관련 함수를 사용하는 것이다. 이것이 곧 웹 하드의 기본 원리라 하겠다. 따라서 [그림 1]에 대한 이해를 먼저 하여야 한다. 요약하면 user mmlt;-mmgt; web-server mmlt;-mmgt; ftp server 간의 상호 네트워크 통신이 가능하다는 것이다.


2.2 FTP 예제

// set up basic connection
// ftp 서버에 접속한다. 예제에서는 ip로 접속을 했다.
$ftp_server="210.220.230.1" // or ="ftp.myweb.co.kr";
$conn_id = ftp_connect($ftp_server); 

// login with username and password
// 사용자 id 및 passwd 설정
// 
$ftp_user_name = "tommy";
$ftp_user_pass = "123465";
// 사실 이 부분은 민감한 부분이므로 include 하여 사용하던지 또는 DB를 이용하기를 바란
// 다. 잘 아는 사실이겠지만 Id, Passwd에 대한 보안은 스스로 해야 한다.
// 필요한 경우 ssl을 이용하여 접속 할 수 있다.
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); 

// check connection
// ftp 사이트 없던지 또는 로그인이 fail 한다면
if ((!$conn_id) || (!$login_result)) { 
       echo "FTP connection has failed!";
       echo "Attempted to connect to $ftp_server for user $ftp_user_name"; 
       exit; // 프로세스 종료. 따라서 if문 다음의 모든 php코드는 실행되지 않는다
   } else { // 로그인 성공
       echo "Connected to $ftp_server, for user $ftp_user_name";
   }

// 파일을 업로드 하는 경우, $destination_file과 $source파일을 form으로부터 얻어온다
// 이 부분은 여러분이 HTML로 작성하여야 한다. 앞서 설명한 
// 부분이 되겠다. 원본과 대상본 파일 이름을 얻어와서 ftp 사이트로 업로딩한다.
// FTP_BINARY란 상수값은 binary파일을 업로딩 하는 경우이며 이에 대한 자세한 정보는 
// mode를 참고하면 되겠다.
// upload the file
$upload = ftp_put($conn_id, $destination_file, $source_file, FTP_BINARY); 

// check upload status
if (!$upload) 
       echo "FTP upload has failed!";
else 
       echo "Uploaded $source_file to $ftp_server as $destination_file";
// ftp 연결을 종료 한다.
// close the FTP stream 
ftp_close($conn_id); 
?>  



2.3 ftp 기본 함수 list

ftp_alloc / ftp_cdup / ftp_chdir / ftp_chmod / ftp_close / ftp_connect / ftp_delete
ftp_exec / ftp_fget/ ftp_fput / ftp_get_option / ftp_get / ftp_login / ftp_mdtm
ftp_mkdir / ftp_nb_continue / ftp_nb_fget / ftp_nb_fput / ftp_nb_get / ftp_nb_put
ftp_nlist / ftp_pasv / ftp_put / ftp_pwd / ftp_quit / ftp_raw / ftp_rawlist /ftp_rename ftp_rmdir / ftp_set_option / ftp_site / ftp_size / ftp_ssl_connect / ftp_systype


3. 결론

지금까지 웹 디스크의 구현 원리에 대하여 알아보았다. 웹 디스크, 인터넷 디스크, 웹 하드 등의 이름으로 불리어 지는 웹 디스크의 구현은 그다지 어렵지 않다고 생각한다. 몇가지 더 추가하자면 My-SQL과 같은 데이터베이스 엔진을 결합한 더 완벽한 웹 디스크 구현을 할 수 있다고 생각한다. 아쉽지만 여기서 글을 마감한다. 여러분 스스로 웹 디스크를 만들어 보고 테스트 해 보기 바란다.

그리고 다양한 기능, 즉 클라이언트 측면의 사용 편리성은 별도의 프로그래밍 언어로 구현해 보기를 권장한다. 또 시간적 여유가 된다면 리눅스 기반의 스트리밍 서버 구현에 대하여 글을 올릴까 한다. 끝으로 리눅스의 발전에 일조하는 마음으로 이 글을 올린다.


(참고)
1. http://www.php.net
2. 레드햇 리눅스 매뉴얼 : vsftp 설치 관련
3. 레드햇 리눅스 매뉴얼 : 디스크 용량제한 관련
4. 레드햇 리눅스 매뉴얼 : 아파치 웹 서버 구축 관련
5. 레드햇 리눅스 매뉴얼 : DNS 서버(bind) 구축 관련
TAG :
댓글 입력
자료실

최근 본 상품0