[원문] http://swbae.egloos.com/1137243

요즈음 일정 규모 이상의 기업에서는 워낙 보안이 강화되어 업무적으로 필요한 사이트가 아니면 접근을 제한하고 있죠. 그러나 회사에서 업무를 하다보면 '뉴스 수집' 등을 위해 어쩔 수 없이 블로그 사이트에 접속해야 하는 경우도 발생합니다. 이럴 때마다 매번 방화벽 담당자에게 연락해서 자신의 제한을 풀어주도록 요구하는 것은 쉽지 않은 일이고, 으레 '회사 정책 상 안됩니다.'라는 답변을 듣기 마련이죠.

오늘은 SSH을 이용하여 방화벽에서 차단된 웹 사이트에 접속하는 방법을 알아보도록 하겠습니다. 먼저 주의하실 사항이 있는데, 아래에서 설명하는 방법은 회사의 보안 정책을 어기는 행위이며, 회사 네트워크 보안을 위협하는 행위이므로 불가피한 상황이 아니면 절대 사용하지 말기를 권고합니다. 또한 아래 기법을 사용하시기 이전에 해당 노트북 혹은 컴퓨터에 최신 윈도우 패치가 설치되어 있고, 바이러스 백신이 활성화되어 있는지, 최신 패턴으로 업데이트가 되어 있는지 확인하신 후 사용하시기 바랍니다. 자칫 잘못하다가는 문제를 일으켜서 회사에서 징계를 먹을 수 있습니다. 그럼 서론은 이쯤에서 생략하고 본격적인 설명에 들어가도록 하겠습니다.

SSH은 네트워크 상에서 데이터가 평문으로 전송되지 않도록 암호화해주는 프로그램입니다. 이미 PuTTY 나 OpenSSH, SSH 등의 다양한 SSH 터미널 프로그램을 사용해보신 분들이 많을 줄로 압니다. 그러나 일반적인 사용 용도 외에도 SSH의 옵션을 뒤져보면 다양한 숨겨진 기능이 많습니다.

이 중 'SSH 터널링'이라는 기능은 유용한데 보안의 입장에서 보면 양날의 검이 될만한 기능입니다. 왜냐하면 이 기능을 이용해 방화벽을 우회할 수 있기 때문이죠.

개념적으로는 다음과 같습니다.


클릭하시면 원본이미지를 보실수있습니다.

위의 그림에서 관리자가 방화벽의 룰셋을 아무리 강하게 설정해두어도 SSH 터널링 기법을 이용하면 외부의 SSH 서버를 통해, 접근이 금지된 사이트, 서버로 접속하는 것이 가능합니다. 쉽게 말하면 방파제를 높게 쌓아두고 작은 구멍을 내놓는 것에 비유할 수 있겠죠. 이제 내부 사용자는 방화벽의 통제를 받지 않고 자신이 하고 싶은 대로 편하게 작업을 할 수 있어 편리한 반면, 회사 내부 네트워크에는 외부에서 접근 가능한 작은 틈새가 생겼습니다.

이제 본격적으로 SSH을 Socks Proxy로 사용하는 방법을 알아보도록 하겠습니다. 지금부터 설명하는 내용은 위의 그림과 같은 구성을 염두에 두고 작성한 것임을 참고하시기 바랍니다.

1. 먼저 외부 SSH 서버에 sshd 를 80 포트로 binding 하여 운영하도록 합니다.
(보안 관리자가 보안에 대한 의지가 강해서 tight 하게 룰셋을 설정한 방화벽이라고 하더라도 직원들이 아예 웹 사이트에 접근하지 못하도록 80 포트를 막는 경우는 거의 없다는 것에 착안한 것입니다).

2. 자신의 노트북 혹은 컴퓨터에 PuTTY를 설치합니다.
메뉴를 한글로 번역한 한글 PuTTY를 사용하시면 더욱 편리합니다.

3. 사용의 편의를 위해 Path 에 PuTTY가 설치된 디렉터리를 추가합니다.

4. 이제 자신의 노트북 혹은 컴퓨터에서 명령행 창을 열고 아래와 같은 명령어를 입력합니다.
putty -D 8080 -P 80 -ssh [외부SSH서버의 IP]

5. 웹 브라우저의 설정에서 (IE의 경우 [도구]->[인터넷 옵션]->[연결]->[LAN설정]->[고급]) 프록시 설정을 다음과 같이 변경합니다.
A. socks 부분에 127.0.0.1 라고 입력합니다.
B. Port 에는 8080 이라고 입력합니다.
C. 위에 있는 HTTP, FTP 등의 다른 부분은 전부 공백으로 합니다.

6. MSN 메신저도 [도구]->[옵션]->[연결]->[고급 설정]에서 프록시 설정을 다음과 같이 변경합니다.
A. socks 부분에 127.0.0.1 라고 입력합니다.
B. Port 에는 8080 이라고 입력합니다.

이제 여러분은 Socks Proxy를 통해 방화벽의 감시나 제한을 받지 않고 간편하게 암호화된 통신을 즐기실 수 있습니다.다시 한번 말씀드리지만 이 방법은 업무 상 피치 못한 경우를 제외하고는 사용하지 않는 것이 좋습니다. 이 점 주의하시기 바랍니다.
# by 헐랭이 | 2005-09-28 11:50 | 보안 도구 사용 | 관련글 | 덧글(4)



====================================================

이 방법을 사용해보니 웬만해선 잘 되긴 하는데 간혹 아웃바운드 80포트를 제외하고 다 막아놓는경우가 있다
그니까 웹페이지 접속만 되게 하고 몽땅 안되게한다는....그럴 경우 허당이다...ㅡㅡ^

허나 내 개인서버가 외부에 어딘가에 도사리고 있다면 얘기가 달라진다..ㅋㅋ 뭐 글케 많진 않겠지만...
바로 ssh의 포트를 80으로 돌려놓으면 해결된다는거~~~-0-;;;;; 위에 써저 있지만...정리삼아...ㅋㅋㅋ

ssh서버가 어디 없나 찾는사람도 있다.
혹시 홈페이지 호스팅 받는거 없는가? 그럼 ssh를 이용할 수 있다
홈페이지 호스팅은 보통 ftp와 ssh를 제공한다.
2007/09/01 23:47 2007/09/01 23:47
명령줄에 추가로 -noide 옵션을 주어야 작동

고스트2003 윈도용일 경우는 그냥 업데이트 한번 하고 하면 문제 없음.
2007/09/01 23:46 2007/09/01 23:46
[서버운영] .htaccess와 워터마킹을 이용한 이미지 링크 방지

[원문]http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=39686&sca=&sfl=wr_subject%7C%7Cwr_content&stx=RewriteRule&sop=and




개인 계정에서 블로그등의 사이트를 운영하시는 분들 중 가끔 외부에서의 컨텐츠 직링크로 인해 트래픽 초과에 걸리시는 분들이 많습니다. 트래픽 문제가 아니더라도, 무단 링크로 인해 저작권을 침해받는 경우도 있겠죠.
이를 해결하기 위해 레퍼러비교 같은 방법도 쓰곤 하는데, 아마 .htaccess 파일을 이용한 것도 많이들 아실 겁니다.

간단히, .htaccess와 워터마킹 기술을 이용해 이미지 링크 제어를 하는 법을 소개합니다.

일단, 이미지들이 저장되는 디렉토리에 .htaccess파일을 만듭니다. (이미 존재한다면 아래의 소스를 마지막에 추가하시면 됩니다.)

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} .*jpg$|.*gif$|.*png$ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !explug\.com [NC]
RewriteCond %{HTTP_REFERER} !eouia0\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
RewriteRule (.*) image.php?image=$1

...........
잠깐 설명을 하자면,

RewriteCond %{HTTP_REFERER} !explug\.com [NC]
RewriteCond %{HTTP_REFERER} !eouia0\. [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]

이 부분에 링크를 허용할 URL들을 기재합니다. 정규식 패턴이므로 잘 알아서.. :)
위의 예의 경우 explug.com, eouia0가 포함되는 사이트, google 등에 링크를 허용한 경우입니다. 이 경우에는 원본 이미지를 마음대로 가져다 쓸 수 있습니다.
그외의 URL에서 링크가 걸릴 경우에는

RewriteRule (.*) image.php?image=$1

에 따라, image.php?image=파일이름 으로 리다이렉트됩니다. 만약 그냥 링크 자체를 끊고 싶으시다면 여기에 아무거나 써주셔도 되지요.

이제 워터마킹 처리를 위해 image.php를 작성합니다. GD라이브러리를 사용했으므로 GD가 사용가능한 계정이어야 합니다.

<?
define ("WATERMARK", "watermark.jpg");

header("Content-type: image/jpeg");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

$pic = strip_tags( $_GET['image'] );

$image_url = urldecode($pic);

if (!@fopen($image_url, "r")) {
    $dst_img = imagecreatefromjpeg(WATERMARK);
    $res = imagejpeg($dst_img, "", 100);
    die();
}

$file = pathinfo($image_url);
switch(strtoupper($file["extension"])) {
    case "JPG":
        $src_img = imagecreatefromjpeg($image_url);
        break;
    case "GIF":
        $src_img = imagecreatefromgif($image_url);
        break;
    case "PNG":
        $src_img = imagecreatefrompng($image_url);
        break;
}

$src_w = imagesx($src_img);
$src_h = imagesy($src_img);

$portion = $src_h / $src_w;
$dest_w = 300;
$dest_h = round($dest_w * $portion);

$dst_img = imagecreatetruecolor($dest_w, $dest_h);
imagecopyresized($dst_img, $src_img, 0, 0, 0, 0, $dest_w, $dest_h, $src_w, $src_h);

$watermark = imagecreatefromjpeg(WATERMARK);

$watermark_w = imagesx($watermark);
$watermark_h = imagesy($watermark);

$overlay_img = imagecreatetruecolor($watermark_w, $watermark_h);
imagecopy($overlay_img, $watermark, 0,0,0,0, $watermark_w, $watermark_h);
imagedestroy($watermark);

$white = imagecolorallocate($overlay_img, 0xFF, 0xFF, 0xFF);
imagecolortransparent($overlay_img, $white);

$offsetX = $dest_w - $watermark_w - 3;
$offsetY = $dest_h - $watermark_h - 3;

imagecopymerge($dst_img,$overlay_img,$offsetX,$offsetY,0,0,$watermark_w,$watermark_h, 100);
imagedestroy($overlay_img);

$res = imagejpeg($dst_img, "", 100);
imagedestroy($dst_img);
?>

실행예는 링크를 보시면 이해하실 수 있을 겁니다. 링크를 허용한 사이트에서는 원본이, 링크를 허용하지 않은 사이트에서는 image.php에 의해 워터마크처리된 이미지로 링크가 걸리게 됩니다. 여기에서는 예를 위해 워터마킹 처리된 이미지의 사이즈를 가로 300으로 고정시켰지만 이 부분은 적당히 소스를 고치시면 원하는 대로 적용시키실 수 있으실 겁니다.
2007/09/01 23:38 2007/09/01 23:38
[서버운영] 무한대 2차도메인 생성 (apache + mysql 이용)  
[원문] http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=13544&sca=&sfl=wr_subject%7C%7Cwr_content&stx=RewriteRule&sop=and 
글쓴이   신재국  날 짜 02-11-25 21:44  조 회 5527


Link1   http://terran.co.kr/ (7)


무한대 2차도메인 생성 (apache + mysql 이용)



안녕하세요.
프로그래머 생활이 재밌기를 바라며 한가지 tip 이라 생각되어 이렇게
글을 올립니다.


개인적으로, 한대의 서버에 여러 도메인과
각 도메인에 대한 2차 도메인을 회원들에게 서비스하고 있습니다.


허나, 회원들의 요청이 많아지게되자,
named 에 계속 추가하여 named restart 시켜주는 방법, 회원 관리가
적절치 못하다고 생각하였습니다.


이곳저곳 문서를 찾다가
우연히 apache 에서 세팅이 가능하며,
name 서버에 일일이 추가하지 않아도 되기에
저의 성공사례를 올립니다.


저의 경우 1대의 서버에
XXX.co.kr
YYY.co.kr
ZZZ.co.kr 도메인을 운영하고,
각각의 도메인에 2차도메인을 부여하여 운영하고 있습니다.

회원이 많아짐에 따라 mysql을 이용하여 2차도메인 정보를 저장하고 있습니다.



서버설정은 아래와 같습니다.


1. 아파치 세팅

1-1.
아파치는 mod_rewrite 모듈이 탑재되어 있어야 합니다.
아파치의 모듈들이 설치된 디렉토리에 mod_rewrite.so 가 없는 경우.

apache 를 다시 컴파일 합니다.

env CFLAGS="-DEAPI" \
./configure \
--prefix=/etc/httpd \
--enable-module=so \
--enable-shared=max \
--enable-module=rewrite \
--enable-shared=rewrite

make
make install



1-2.

httpd.conf 에서 다음을 확인하고 없으면 추가합니다.

LoadModule rewrite_module libexec/mod_rewrite.so
AddModule mod_rewrite.c


1-3.
최 하단에 버&#52664;호스트를 다음과 같이 작성합니다.
저의 경우는 3개의 도메인을 사용하는 관계로
아래와 같이 3번을 작성하였습니다.

NameVirtualHost xxx.xxx.xxx.xxx

<VirtualHost xxx.xxx.xxx>
ServerName XXX.co.kr
ServerAlias *.XXX.co.kr
SetEnv force-no-vary
RewriteEngine on
RedirectMatch permanent ^/~([^/]+)(.*)$ http://$1.XXX.co.kr$2
RewriteCond %{HTTP_HOST} !^www\.XXX\.co\.kr$
RewriteCond %{HTTP_HOST} !^XXX\.co\.kr$
RewriteCond %{REQUEST_URI} !^/~(.+)$
RewriteCond %{HTTP_HOST} ^([^.]+)\.XXX\.co\.kr$
RewriteRule ^(.+) /home/XXX/htdocs/virtual/index.html
CustomLog logs/rewrite_access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
</VirtualHost>


<VirtualHost xxx.xxx.xxx.xxx>
ServerName YYY.co.kr
ServerAlias *.YYY.co.kr
RewriteEngine on
RedirectMatch permanent ^/~([^/]+)(.*)$ http://$1.YYY.co.kr$2
RewriteCond %{HTTP_HOST} !^www\.YYY\.co\.kr$
RewriteCond %{HTTP_HOST} !^YYY\.co\.kr$
RewriteCond %{REQUEST_URI} !^/~(.+)$
RewriteCond %{HTTP_HOST} ^([^.]+)\.YYY\.co\.kr$
RewriteRule ^(.+) /home/XXX/htdocs/virtual/index.html
CustomLog logs/rewrite_access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
</VirtualHost>


<VirtualHost xxx.xxx.xxx.xxx>
ServerName ZZZ.co.kr
ServerAlias *.ZZZ.co.kr
RewriteEngine on
RedirectMatch permanent ^/~([^/]+)(.*)$ http://$1.ZZZ.co.kr$2
RewriteCond %{HTTP_HOST} !^www\.ZZZ\.or\.kr$
RewriteCond %{HTTP_HOST} !^ZZZ\.or\.kr$
RewriteCond %{REQUEST_URI} !^/~(.+)$
RewriteCond %{HTTP_HOST} ^([^.]+)\.ZZZ\.or\.kr$
RewriteRule ^(.+) /home/XXX/htdocs/virtual/index.html
CustomLog logs/rewrite_access_log "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
</VirtualHost>




2-1. named 설정

해당하는 zone 파일에서 호스트 이름에 "*" 문자를 사용합니다. (제일 하단부분에 추가)
*         IN         A         xxx.xxx.xxx.xxx



3-1. mysql table 생성 - 회원이 2차 도메인을 신청시 DB 저장

CREATE TABLE forward (
num int(11) NOT NULL auto_increment,                // 순번
u_id varchar(20) NOT NULL default '',                // 사용자 ID
f_id varchar(20) NOT NULL default '',                // 2차 도메인(아이디)
f_domain varchar(20) NOT NULL default '',        // 2차 도메인(순수 도메인)
title varchar(200) NOT NULL default '홈페이지에 오신걸 환영합니다',
home varchar(200) NOT NULL default '',        // 포워딩 처리될 개인 홈페이지 주소
comment varchar(200) default NULL,
reg_date timestamp(14) NOT NULL,
PRIMARY KEY (num),
KEY IDX_UID (u_id),
KEY IDX_FORW (f_id,f_domain)
) TYPE=MyISAM COMMENT='2차도메인 포워딩 서비스 테이블';





P.S

1)
웹 요청이 있을시에 해당 도메인은 모두
/home/XXX/htdocs/virtual/index.html 페이지를 열게 됩니다.
(아파치 설정 참고)


/home/XXX/htdocs/virtual/index.html 화일은 아래와 같습니다.

<html>
<head>
<title>::XXX.co.kr:: <?=$id?>.<?=$domain?> :: <?= $title?></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<frameset rows="100%,*" border=0>
<frame src=http://<?=$home?> name=_MAIN_><frame name=NARAE></frameset></head></html>
</body>
</html>



2) /home/XXX/htdocs/virtual/index.html 페이지에서는 다음과 같은 일을 해주어야 합니다.

우선,
test.XXX.co.kr 접속이 요청되면 test 와 XXX.co.kr 를 분리시키고,

회원이 신청한 2차 도메인을 mysql 에서 찾습니다.
정보에 맞는 내용을 mysql 에서
뽑아와서 아래의 index.html 에 적당히 뿌려주면 됩니다.



이상으로 허접 tip 을 올립니다.
기존 문서를 참고한것이며,

이곳에도 필요할것 같아..^^*


버그 또는 문제점은 리플 부탁합니다.
그럼 즐플 하세요.

적용사이트 http://terran.co.kr/



=======================
 
   샘플러    02-11-26 00:18  
좋은 정보 고맙구요. 조금만 응용하면 많은 활용가능하겠네요^^  

좋은 정보 고맙구요. 조금만 응용하면 많은 활용가능하겠네요^^
 
   와키    02-11-26 04:27  
호홋~! 좋네요. 감사합니다.  

호홋~! 좋네요. 감사합니다.
 
   달팽이    02-11-26 07:32  
아이디가 test일때
http://test.terran.co.kr/ 이렇게 말구요
http://terran.co.kr/test 이렇게두 가능한가요?  

아이디가 test일때
http://test.terran.co.kr/ 이렇게 말구요
http://terran.co.kr/test 이렇게두 가능한가요?
 
   첩현    02-11-26 08:11  
가능합니다.....
---------------
mod_rewrite 는 약간의 문제가 좀 있어서..
전 mod_rewrite하고 mod_vhost_alias 를 같이 쓰는데요...
mod_rewrite만 쓸때의 문제는 어느정도 해결이 됐네요.....  

가능합니다.....
---------------
mod_rewrite 는 약간의 문제가 좀 있어서..
전 mod_rewrite하고 mod_vhost_alias 를 같이 쓰는데요...
mod_rewrite만 쓸때의 문제는 어느정도 해결이 됐네요.....
 
   첩현    02-11-26 08:13  
근데.. 디비에서 뽑아서 한곳으로 연결후 저렇게 연결해 줄꺼면..
왜 mod_rewrite 를 쓰는지요? mod_rewrite 없이 단순 설정으로 저 부분은 가능합니다.  

근데.. 디비에서 뽑아서 한곳으로 연결후 저렇게 연결해 줄꺼면..
왜 mod_rewrite 를 쓰는지요? mod_rewrite 없이 단순 설정으로 저 부분은 가능합니다.
 
   신재국    02-11-26 10:34  
흐미,,, 계정없이 사용된다면,
궂이 rewite 를 쓸 필요가 없겠네요....

제가 뭔가 착각을 한것 같네요.

암튼 위의 내용은 계정.xxx.co.kr  을 적용할때,
사용되면 좋겠네요...참고하세요.  

흐미,,, 계정없이 사용된다면,
궂이 rewite 를 쓸 필요가 없겠네요....

제가 뭔가 착각을 한것 같네요.

암튼 위의 내용은 계정.xxx.co.kr  을 적용할때,
사용되면 좋겠네요...참고하세요.
 
   WOWpc    02-11-26 17:41  
rewrite 까지 쓸 필요 없는 내용인데요 괜히 복잡하게 하신듯...  

rewrite 까지 쓸 필요 없는 내용인데요 괜히 복잡하게 하신듯...
 
   JNJ    02-11-26 21:06  
mod_rewrite에 관한 정보만으로도 훌륭합니다.
좋은 팁이네요.  

mod_rewrite에 관한 정보만으로도 훌륭합니다.
좋은 팁이네요.
 
   난이    02-11-27 16:37  
저도 예전에 비슷한 방법으로 해보았습니다.
잘되긴 하는데 경우에 따라서는 안된다고 하는 클라이언트도 있었습니다.
대부분은 잘되는데 한두명이 안된다고 하더라고요.
제가 직접 확인한 적이 없어서 잘 모르겠습니다만, 혹시 그런 경험 해보신분 있으시면 올려주세요  

저도 예전에 비슷한 방법으로 해보았습니다.
잘되긴 하는데 경우에 따라서는 안된다고 하는 클라이언트도 있었습니다.
대부분은 잘되는데 한두명이 안된다고 하더라고요.
제가 직접 확인한 적이 없어서 잘 모르겠습니다만, 혹시 그런 경험 해보신분 있으시면 올려주세요
 
   ㅋㅋㅋ    03-02-11 02:28  
ㅡㅡ 잘못 쓰면 서버 부하 장난 아님니다.. 아파치 폭주~~
이거 말구 다른 방법 쓰세요..  

ㅡㅡ 잘못 쓰면 서버 부하 장난 아님니다.. 아파치 폭주~~
이거 말구 다른 방법 쓰세요..
 
   스리빠    03-08-12 21:30  
헐..2000년부터 난 2차도메인 * <--요걸루만 사용하는데..
DB같은거 필요 없음--; 걍 zone 화일에 * 만 추가하십시여  

헐..2000년부터 난 2차도메인 * <--요걸루만 사용하는데..
DB같은거 필요 없음--; 걍 zone 화일에 * 만 추가하십시여
 
   김성진    04-05-25 03:49  
리눅스 개발구룹에서 zone 파일과 httpd.conf 파일에
\" * \" 사용하는것이 DOS 공격과 보안에 대하여 취약하다는
발표가 있었습니다..
참고하세요..  

리눅스 개발구룹에서 zone 파일과 httpd.conf 파일에
\" * \" 사용하는것이 DOS 공격과 보안에 대하여 취약하다는
발표가 있었습니다..
참고하세요..
 
   아웅    05-07-13 20:05  
음..좋은정보 감사. 참고해서 셋팅해보겠습니다.  

음..좋은정보 감사. 참고해서 셋팅해보겠습니다.
 
   헐랭이   06-01-17 11:49  
ServerAlias *.XXX.co.kr  요것만 있어도 되는것 같은데요.
2007/09/01 23:37 2007/09/01 23:37
[원문] http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=35182&sca=&sfl=wr_subject%7C%7Cwr_content&stx=RewriteRule&sop=and 

음...대략 주소를 짧게?? -0-;;;;
음....예를 들면
http://www.zekill.pe.kr/drz/board/list.php?bs=4&ps=0&stp=&stx=&sc=0&pg=1
뭐 이런 주소를....

http://www.zekill.pe.kr/drz/board/41
뭐 이런식으로....라고 해야하나...-0-;;;

대략 네이버 야후 뭐 이런 곳의 블로그 스타일 주소를 보면 이해 될듯....

실제로 그런 포탈에서 이걸 이용할지는 모르겠으나 이 모듈을 이용해
그와 비슷하게 따라할수는 있다는....-0-;;;;

테스트는 안해봤다는....-0-;;;

==================================================


[서버운영] 아파치 REWRITE 모듈 사용법

작성자 : 윤 일

Apache rewrite Module


Apache 는 추가적으로 사용할 수 있는 유용한 모듈들을 제공합니다.

이번강좌에서는 Apache의 URL Rewrite 모듈을 사용하기 위한 컴파일,설치 와 httpd.conf의 설정방법 그리고 활용방법에 대해 알아보겠습니다.



Apache 다운로드 : http://www.apache.org

1. rewrite 모듈을 사용하기 위한 Apache 컴파일옵션

Rewrite 모듈을 쓰기위한 Apache 컴파일 옵션은 --enable-rewrite 입니다.

Configure 실행시에  --enable-rewrite 만 추가하시면 Apache에서 rewrite 모듈을 사용할 있게 됩니다.

[root@superuser root]# ./cofigure prefix=/usr/local/apache2 --enable-rewrite

[root@superuser root]# make

[root@superuser root]# make install



1. Rewrite 를 적용할 수 있는 범위

Rewrite 설정은 Server Config, Virtual Host, Directory, .htaccess 에 설정할 수 있습니다.

즉 Apache 서버 전체에 Global 설정과 특정 가상호스트에만 적용하도록 할수 있고 특정 디렉토리에만 적용시킬수도 있습니다.



2. Rewrite 모듈 지시자

RewriteEngine
설정문법 : RewriteEngine On|Off

Rewriteing 엔진을 사용할지 여부를 설정합니다. 기본설정은 당연히 Off로 되어 있으며 RewriteEngine On 으로 설정하지 않는 이상 Rewritng 엔진을 활성화 시키지 않습니다.



현재 Apache에서 실행중인 모든 RewriteRule을 비활성화 시킬 때 RewriteRule 라인을 주석처리 하기보다 RewriteEngin Off 로 설정하는 것이 더 간편하고 올바른방법입니다.



RewreteLog
설정문법 : RewriteLog FILE-PATH

RewriteLog 지시자는 Rewrite 엔진의 로그를 그록할 파일을 지정합니다.
RewriteLog 파일을 항상 남기기 보다 잘못된 Rewrite 규칙들을 디버킹할 때 사용하기를 권장합니다. 아파치와 마찬가지로 RewriteLog 파일도 방문자수가 많은사이트에서는 감당못할 정도의 로그파일을 남기기 때문에 시스템 여유공간이 많이 없는 시스템에서는 해당 파티션의 하드사용률 100%로 인한 재앙(?)을 불러올수도 있습니다. 다음강좌에서 소개될 로그파일 분석에서 언급하겠지만 로그파일은 유용한 디버깅 도구가 될수 있지만 잘못 관리하면 시스템의 치명적인 악으로 존재할수도 있습니다.

RewriteLog 지시자는 반드시 RewriteLogLevel 지시자와 함께 사용하여야 됩니다.



RewriteLogLevel
설정문법 : RewriteLogLevel Level

RewriteLogLevel 지시자는 RewriteLog 지시자로 설정한 로그파일에 기록할 로그들에 대해 얼마나 자세한 내용을 로그로 남길것인가에 대해 설정하는 지시자입니다.

기록할 로그 Level 은 0 ~ 9까지 사용할 수 있으며 0은 로그를 기록하지 않겠다는 의미입니다. Level 숫자가 높을수록 자세한 로그를 기록합니다



RewriteCond
설정문법 : RewriteCond TestStirng CondPattern

RewriteCond 지시자는 RewriteRule 과 함께 사용되는 규칙으로 RewriteCond 다음에 오는 RewriteRule은 RewrieteCond 에서 설정한 패턴과 일치해야지만 RewriteRule들을 실행한다.



RewriteRule
설정문법 : RewriteRule Pattern Substitution

Rewrite 모듈의 실질적인 Rewrite 규칙들을 적용하는 지시자입니다.

Pattern(Input URL) 을 Subtitution(Return URL)로 변경하기 위한 모든 규칙들은 이 지시자를 사용해서 설정해야 됩니다.

Pattern(Input URL) 에는 Perl 정규표현식을 사용할수 있기 때문에 Input URL 의 규칙을 유연하게 적용할 수 있습니다. 이 강좌에서는 기초적인 정규표현식 사용방법만 다루고 정규표현식에 대해 자세히 알고 싶으신 분은 정규표현식에 대한 강좌나 인터넷 문서를 참고하시기 바랍니다.



정규표현식 기초

. : 다수의 한문자

? : 0개 이상의 한문자

* : 0개 이상의 문자 또는 문자열

+ : 1개 이상의 문자 또는 문자열

(chars) : (, ) 안의 문자또는 문자열을 그룹으로 묶습니다. 이 문자그룹은 Substitution(return URL)에서 $N 의 변수로 활용할수 있습니니다.

^ : 문자열의 첫문(열)을 지정합니다.

$ : 문자열의 끝 문자(열)을 지정합니다.

\(역슬래쉬) : 정규표현식에서 특별한 의미로 사용되는 문자의 특수기능을 제거합니다.(예:(, ), [, ] . 등)

{n} : 정확히 n번 반복

{n,} : n번 이상 반복

{n,m} : n 이상 m 이하 반복

[chars] : 문자들의 범위 또는 표현할 수 있는 문자들을 설정합니다.
예) [a-z] : a 부터 z 까지의 소문자, [tT] : 소문자 t 또는 대문자 T



정규표현식 단축표현들

[:alpha:] : 알파벳. [a-zA-Z] 와 같은 표현

[:alnum:] : 알파벳과 숫자. [a-zA-Z0-9] 와 같은 표현

[:digit:] : 숫자 [0-9] 와 같은 표현

[:upper:] : 대문자. [A-Z] 와 같은 표현



RewriteRule 플래그

forbidden|F : 요청하는 페이지를 403 에러로 redirect 시킵니다. RedirectRule 이 적용되고 있는 페이지를 일시적으로 사용중단을 시키거나 사용자로 하여금 페이지 접근을 할수 없게 할 때 사용합니다.

예) RewriteRule ^/test /home/blog/html/test.php [F]

사용자가 /test 로 접근할 경우 403 에러를 보냅니다.

gone|G : 요청하는 페이지를 410 에러로 redirect 시킵니다. 410 에러는 페이지가 사라&#51220;거나 존재하지 않는다는 메시지입니다. 이것도 forbidden 과 마찬가지로 RedirectRule 이 적용되던 페이지를 일시적으로 중단시킬 때 유용하게 사용할 수 있습니다.

last|L : 이 플래그가 적용되면 뒤에 어떤 룰이 있더라도 이룰 아래의 규칙들은 적용되지 않고 RewriteRule 을 빠져나가게 됩니다. C, Perl, PHP 프로그램에서 루프를 빠져나가는 break 와 같은 의미를 가집니다.

chain|C : 이 플래그의 결과를 다음 RewriteRule 의 input 값으로 사용합니다.
예)

RewriteRule ^(.+) %{HTTP_HOST}$1 [C]

RewriteRule ^([^.]+)\.domain\.com(.*) /home/$1/public_html$2



이 룰은 사용자 홈의 도메인을 2차 도메인으로 자동설정해 줄 때 많이 쓰는 룰입니다. RewriteRule의 input은 도메인을 제외한 URI 를 인식하기 때문에 도메인까지 인식을 시켜서 다음 RewriteRule 로 체크를 하기 위해 사용한 것입니다.

즉 http://user_id.domain.com/hello.html 이란 요청이 들어오면  /home/user_id/public_html/hello.html 로 redirect 시켜줍니다. 위와 같이 2차 도메인을 이용해 계정 사용자의 홈을 지정하기 위해서는 DNS 세팅이 선행되어야 됩니다.



RwriteRule 설정예



1. http://yourdomain.com/user_id  ->  http://yourdomain.com/home.php?id=user_id



RewriteRule ^/([a-zA-Z0-9])$   /home/user_id/public_html/home.php?id=$1

설명 : 도메인(http://yourdomain.com) 뒤에 오는 영문숫자로된 문자열을 지정하면서 그룹으로 묶었습니다. 이렇게 그룹으로 설정된 문자열 Pattern 은 Substitution(return URL) 에서 $1 이라는 변수로 받아 사용하게 됩니다. 즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜줍니다. 블로그나 카페(동호회) 사이트에서 블로그 사용자의 ID 로 개인 블로그 주소를 부여할 때 http://blog.com/user_id 로 부여해 주지만 실제 실행되는 파일은 이와 같이 redirect 시켜주는 경우가 많습니다.



2. http://yourdomain.com/daum  -> http://www.daum.net

RewriteRule ^/daum$  -> http://www.daum.net

설명 : http://yourdomain.com/daum 라는 페이지 요청이 들어오면 도메인이 다른 http://www.daum.net 이라는 페이지로 redirect 시켜줍니다.





RewriteOptions
설정문법 : RewriteOptions Options

현재 사용할 수 있는 option 은 MaxRedirects=number 를 사용할 수 있으며 설정된 number값에 도달하게 되면 500 Internal Server Error 를 남기고 RewriteRule을 종료합니다. 잘못된 RewriteRule에 의한 무한 루프를 방지하기 위한 목적으로 사용되는데 시스템이 이유없이 다운된다거나 할 때 이 옵션과 Log 기록을 참고하여 디버깅 및 시스템 다운을 방지할 수 있습니다.

이 지사자는 Apache 2.0.45 이상에서 사용할 수 있습니다.



3. 실제 적용예

가상호스트 blog.xxx.ac.kr 에 대해 Rewrite Rule을 적용한 예입니다. 이 부분은 실제 운영되는 블로그 사이트를 위해 RewriteRule 을 적용한 예입니다.


DocumentRoot /home/blog/html

ServerName blog.xxx.ac.kr

# 여기까지는 일반적인 가상호스트 설정입니다.

RewriteEngine on

# RewriteRule을 사용하기 위해 On 으로 설정합니다.



RewriteLog /home/blog/rewrite_log_admin3.log

RewriteLogLevel 9

# Rewrite 실행중 Log를 남기기 위해 로그파일과 로그레벨을 지정했습니다.



RewriteRule ^/tb/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/trackback\.php\?id=$1&post_no=$2

# 위설정은 블로그에 등록된 포스트의 트랙백 주소를 부여하기 위해 설정한 RewriteRule 로써 Pattern에 두개의 그룹이 존재하고 return URL에 순서대로 각 그룹을 $1 과 $2 로 받아 GET 변수로 치환한것입니다.



RewriteRule ^/xml/([a-zA-Z0-9]+)$ /home/blog/html/blog/rss_feed\.php\?id=$1

# 각블로그별 RSS 주소를 실제 파일로 지정한것입니다.



RewriteCond %{REQUEST_URI}     !^/admin$

RewriteRule ^/([a-zA-Z0-9]+)$ /home/blog/html/blog/main\.php?id=$1

# 먼저 RewriteCond 로 실제 존재하는 admin 이라는 디렉토리를 이어지는 RewriteRule에서 제외시키고 http://domain.com/user_id 로의 요청을 모두 /home/blog/html/blog/main.php?id=user_id로 redirect 시키는 룰입니다.



RewriteRule ^/([a-zA-Z0-9]+)/([0-9]+)$ /home/blog/html/blog/main\.php\?id=$1&post_no=$2

# /user_id/1345 로 요청하는 페이지를 /home/blog/html/blog/main.php?id=user_id&post_no=1345 로 redirect 시키는 룰입니다.




4. 마치면서

위에서 언급한 RewriteRule 뿐만 아니라 여러가지 상황에서 RewriteRule을 잘 활용한다면 아주 유용하게 웹페이지를 컨트롤 할수 있습니다. RewriteRule 을 세팅하기 이전에 반드시 정규표헌식에 대해 어느정도 공부한후 적용해 보실 것을 권합니다.
=================================================================

아라치    04-11-10 07:54  
즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜주는데 브라우져 주소창에다가.. http://yourdomain.com/superuser  요거를 유지할려면 어떤 옵션이 별도로 있나요? 주소가 바뀌어버리는데...  

즉 http://yourdomain.com/superuser 라는 페이지 요청이 들어오면 실제로는 http://yourdomain.com/home.php?id=superuser 라는 페이지로 redirect 시켜주는데 브라우져 주소창에다가.. http://yourdomain.com/superuser  요거를 유지할려면 어떤 옵션이 별도로 있나요? 주소가 바뀌어버리는데...
 
   지나가다    04-11-10 19:42  
끝에 [L] 넣어주면 주소 안변해용. 얌얌.
2007/09/01 23:35 2007/09/01 23:35