본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 32. Perlprog - BBS 11

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Perlprog - BBS 11

Description

게시판 만들기 11 - 관리자 모드


BBS 만들기 11

 이제 게시판 만들기의 마지막 부분입니다. 지금까지 쓰고, 읽고, 답변하고, 지우고, 검색하고 등을 했죠. 이젠 이런 일련의 작업들에 있어서 슈퍼유저가 있어야 합니다. 삭제하고, 잘못된 글들을 지우고, 편집을 수행할 수 있는.... 이런 권한을 가지는 사용자를 만들어 보겠습니다.

준비과정(Start)

 우선 먼저 할 것이 있죠. 삭제나 편집 때와 마찬가지로 관리자의 암호를 입력 받아서, 확인하는 절차가 필요하죠. 그 전에, 처음 게시판을 설치하고, 관리자 모드로의 접속을 한다면, 초기화된 관리자 암호가 없으므로 관리자의 암호를 초기화 하는 과정이 필요합니다.

관리자 초기화(init)

 그렇게 복잡한 건 아닙니다. 관리자의 암호를 누르면, 당연.. 암호를 입력하라는 페이지가 나오구여, 여기에 암호를 입력하죠. 이때... 물론 처음이니깐, 만들어진 암호파일은 없습니다. 우린 이걸 검사해서, 초기화된 암호파일이 없으면 새로 만들고, 있으면 두 개의 암호를 비교하면 됩니다.

e (파일 연산자)

 e 연산자는 그 파일이 존재하는지, 존재하지 않는지를 검사해서 존재하면 참을, 존재하지 않으면 거짓을 리턴합니다.

 우리가 미리 관리자 암호 파일을 'admin.pwd'라고 지정해 놓았다면,

$AdminPwd = "admin.pwd";
if(!(-e "$AdminPwd"))
{
	print "초기화된 암호가 없습니다.";
}
							

이런 식으로의 검사를 거치게 됩니다. 위의 print문 대신 새로운 암호를 만드는 과정을 거치면 됩니다. 이전에 입력된 암호를 crypt()함수를 이용해서 암호화하는거 잊지 마시구여.

 
if(!(-e "$AdminPwd))
{
	## 아래의 get_password() 함수의 구현은 이미 했었죠. 그것과 같습니다. 리턴 값이 $Pwd라고 하구여
	&get_password;
	
	open(PWD, ">$AdminPwd") || die;
	print PWD $Pwd;
	close(PWD);
}
else
{
	&Confirm_pass;
}
							

 이런식으로 암호가 초기화되어 있었다면, 암호를 검사하는 Confirm_pass()함수를 호출해서 암호를 검사합니다.

 암호가 틀리면 ``당신 누구야!!!'' 라고 하시든지....:) 암호가 맞으면 관리자의 권한이 주어지게 됩니다. 이 때 한 번 권한이 주어지면 그 브라우저의 창이 닫히기 전까지는 유효해야죠. 삭제를 하든, 편집을 하든, 게시판을 만들든.... 서버와 클라이언트의 지속적인 관계가 필요합니다.

 이럴 때 사용하게 되는 것이 바로 쿠키(Cookie)라는 것입니다.

 다음은 쿠키를 설정하는 아주 간단한 예입니다.

Set-Cookie: SuperUser=Admin;

나머지 값(expires, domain...)을 지정하지 않았을 경우는 디폴트 값이 쓰이게 되며, expires의 값을 지정하지 않으면, 현재의 세션이 끝날 때까지만(쿠키를 생성한 브라우저의 종료까지만) 유효합니다.

Cookie 사용

 이 쿠키는 네스케이프에서 시작한 http 확장자 입니다. 이것은 http 응답 헤더에 약간의 정보를 담아서 같이 전달하는 역할을 하게 됩니다.

Set-Cookie: name=value; expires= ; domain= ; path=\;

 name은 쿠키 이름이고, expires는 쿠키의 종료날짜, domain은 쿠키를 생성한 서버를 가리키고, path는 쿠키를 보낸 Uniform Resource Identifier의 path를 가지게 됩니다.

 또한 하나의 도메인이나 서버에 20개 이상의 쿠키가 존재할 수 없으며, 그 크기가 4K를 넘을 수 없습니다. 클라이언트는 300개까지의 쿠키만이 존재할 수 있습니다. 이 4K로 뭘 하나 싶지만... 웬만한 정보는 다 넣을수 있습니다. ^^;

Admin Cookie 의 생성

 쿠키를 생성하실 때의 간단한 예입니다.

SetCookie()
if($pass eq $oldpass)
{
	&SetCookie;
	&print_header;
	print "쿠키가 생성되었습니다.";
}

# ...... 생략 ......

sub SetCookie
{
	print "Set-Cookie: BoardMaker=SuperUser\n";
}

sub print_header
{
	print "Content-type: text/html\n\n";
}
							

 위와 같이 하시면 됩니다. 진짜루 저장이 되었는지의 확인은 쿠키가 저장되는 디렉토리를 보시면 있습니다. 위의 정보를 보내는 과정에서, 더 필요한 정보들을 보내면 됩니다.

Cookie 읽어오기(GetCookie)

 그럼 쿠기가 저장되었으니깐.. 그 저장된 쿠키를 읽어와야죠. 위에서 생성된게 admin의 정보이니깐, 쿠키를 읽어서, 이 사람이 진짜 admin인지를 가려야 합니다.

환경변수 $ENV{'HTTP_COOKIE'}

 웹 브라우져는 매번 URL을 요청할 때마다 자신이 가지고 있는 쿠키의 상태값들을 대조시켜서, 만약 이 상태값을 만족하는 URL을 사용자가 요청한다면 이 때 저장된 쿠키가 서버로 전달되게 합니다.

웹 브라우져에서 전달되는 모든 쿠키들은 HTTP_COOKIE 라는 환경변수에 저장됩니다.

GetCookie()

 저장된 쿠키를 가져오는 예입니다.

sub GetCookie
{
	local (@cookie, $C_key, $C_val);
	
	@cookie = split(/; /, $ENV{'HTTP_COOKIE'});
	
	foreach (@cookie)
	{
		($C_key, $C_val) = split(/=/, $_);
		$Cookies{$C_key} = $C_val;
	}
	
	if ($Cookies{'BoardMaker'})
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
							

위의 예는 쿠키의 정보를 읽어서 SetCookie에서 정의했던 BoardMaker의 값이 있으면, 참을 리턴하고, 없으면 거짓을 리턴하는 함수입니다.

관리자 확인(Admin)

 위의 과정에서 암호의 확인이 되고, 확인이 되었으면 관리자의 쿠키를 생성하는 것까지 했습니다. 그럼 지금까지 했던 프로그램(편집과 삭제)의 처음에 쿠키를 같이 확인을 합니다. 그래서 참이 된다면, 삭제나 편집 때 암호의 확인 절차없이 바로 지우거나 삭제할 수 있게 하면 됩니다. 쿠키를 생성하기 전에 반드시 암호의 확인 절차가 있어야 하는 건 당연한 겁니다.:)

if(&GetCookie)
{
	# 지우거나 삭제를 바로.....
}
else
{
	# <- 일반 사용자일 경우죠 지우거나 삭제때의 암호를 확인하는 절차를 밟습니다.
}
					

지금까지 만들었던 프로그램을 조금만 수정하시면 되는 일이죠... ^^;


NOTES

 11번에 걸쳐서 게시판 만들기가 끝이 났습니다. 많은 기능들을 다루지는 않았지만, 게시판을 처음으로 만드시는 분들에게 조금이나마 도움이 되리라 생각합니다.

 지금까지 해왔던 것을 기초로 해서 멋진 본인의 게시판을 만들어 보시기 바랍니다. 다른 사람이 만들어 놓은 걸 가져다가 쓰는것두 좋지만여, 기능도 별루 없고, 이뿌지도 않고... 뭐 이렇다 하더라도, 자신이 직접 만든 프로그램으로 사용하시는 것도 좋을 겁니다.

 그럼 다음부터는 Perl 과 DB의 연동에 대해서 다뤄볼까 합니다.

 제가 Perl도 부족하지만, DB는 더 부족하기 때문에.... ^^; 틀리다거나, 아님 더 추가되어야 할 것 같은 사항들을 말씀해주세요.

 지금까지 부족하지만 게시판 만들기 강좌에 관심을 가져주셔서 감사드립니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo