관리 메뉴

tapito.tistory.com

세션을 이용한 Perl(CGI) 로그인/로그아웃 소스 본문

Common Gateway Interface/Perl

세션을 이용한 Perl(CGI) 로그인/로그아웃 소스

Tapito 2018.07.13 20:35

 Perl(CGI)의 세션 모듈을 사용한 로그인/로그아웃 소스입니다.

CGI의 세션 기능을 사용하기 위해서는 CGI::Session 모듈을 설치해야 합니다. cpan install CGI::Session를 통해 설치할 수도 있지만 OS와의 연계를 위해 다음과 같이 패키지를 설치할 것을 권장합니다.

RedHat 계열(CentOS):

$ sudo yum install perl-CGI-Session

 

Debian 계열(Ubuntu):

$ sudo apt-get install libcgi-session-perl

 

login.cgi

 ID와 암호를 입력받아 process.php로 전달하는 소스입니다.


#!/usr/bin/perl

print "Content-type: text/html\n\n";
print<<EndOfHTML;
<!DOCTYPE html>
<html lang="ko">
	<head>
		<meta charset="utf-8" />
		<title>ID와 암호를 입력하십시오.</title>
	</head>
	<body>
		<form method="post" action="process.cgi">
			<label>ID: <input type="text" name="member_id" /></label>
			<label>PW: <input type="password" name="member_password" /></label>
			<input type="submit" />
		</form>
	</body>
</html>
EndOfHTML

 

process.cgi

 ID와 암호를 비교하여 로그인 성공 여부를 판별합니다.


#!/usr/bin/perl

use CGI qw/:standard/; # CGI 모듈을 사용합니다.
use CGI::Cookie; # 쿠키 모듈을 사용합니다.
use CGI::Session; # 세션 모듈을 사용합니다.

my $member_id = "user"; # 로그인할 원래의 ID입니다.
my $member_password = "password"; # 로그인할 원래의 암호입니다.

my $objCGI = CGI->new; # CGI 객체를 새로 만들면서 POST 방식으로 들어온 ID와 암호를 읽어옵니다.
my $objCookie = undef;
my $objSession = undef;

# login.cgi에서 POST 방식으로 전달된 ID와 암호가 원래 값과 일치하면 로그인을 허용합니다.
if (($objCGI->param('member_id') eq $member_id) && ($objCGI->param('member_password') eq $member_password))
{
	# CGI 세션 객체를 생성합니다.
	$objSession = new CGI::Session("driver:File", undef, {Directory=>'/tmp'});

	# 세션에 값을 저장하는 방법은 다음과 같습니다.
	$objSession->param('member_id', $member_id);
	$objSession->param('member_password', $member_password);

	# 세션에 유효기간을 지정합니다. 현재 시점으로부터 1시간동안 유효합니다.
	$objSession->expire('+1h');

	# 현재의 편집을 세션에 완전히 저장합니다.
	$objSession->flush;

	# 세션을 생성하면서 발급된 세션 ID를 쿠키를 통해 클라이언트로 전달합니다.
	$objCookie = new CGI::Cookie(-name=>'CGISESSID', -value=>($objSession->id), -expires=>'+1h');
	print "Set-Cookie: ", $objCookie->as_string, "\n";
}

# 웹 페이지 본문을 작성합니다.
print "Content-type: text/html;charset=UTF-8\n\n";
print "<!doctype html>";
print "<html>";
print "<head>";
print "<meta charset=\"utf-8\" />";
print "<title>login process</title>";
print "</head>";
print "<body>";
if ($objCGI->param('member_id') eq undef)
{
	print "<p style=\"text-align: center;\">ID가 입력되지 않았습니다.</p>";
	print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
}
elsif ($objCGI->param('member_password') eq undef)
{
	print "<p style=\"text-align: center;\">암호가 입력되지 않았습니다.</p>";
	print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
}
else
{
	if ($objCGI->param('member_id') ne $member_id)
	{
		print "<p style=\"text-align: center;\">ID가 일치하지 않습니다.</p>";
		print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
	}
	elsif ($objCGI->param('member_password') ne $member_password)
	{
		print "<p style=\"text-align: center;\">암호가 일치하지 않습니다.</p>";
		print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
	}
	else
	{
		print "<p style=\"text-align: center;\">로그인 성공</p>";
		print "<p style=\"text-align: center;\"><a href=\"membership.cgi\">회원 페이지</a></p>";
	}
}
print "</body>";
print "</html>";

 

membership.cgi

 로그인 한 회원에게만 보여질 페이지입니다. 로그인 하지 않고 접속한 경우 로그인 페이지로 안내합니다.


#!/usr/bin/perl

use CGI qw/:standard/; # CGI 모듈을 사용합니다.
use CGI::Cookie; # 쿠키 모듈을 사용합니다.
use CGI::Session; # 세션 모듈을 사용합니다.

my $objCGI = CGI->new; # CGI 객체를 새로 생성합니다.
my %objCookies = undef; # 이 페이지로 전달된 쿠키 객체입니다.
my $objSession = undef; # 세션 객체입니다.
my $success = 0; # 로그인 성공 시 1, 아니면 0이 보관될 변수입니다.

%objCookies = fetch CGI::Cookie; # 쿠키를 읽어옵니다.

if ($objCookies{'CGISESSID'} ne undef) # 쿠키가 존재하면...
{
	# 쿠키에 저장된 항목 중 'CGISESSID'를 참조합니다. 이 항목의 값에 세션 ID가 보관되어 있으며
	# 세션 ID를 가지고 기존에 보관된 세션을 읽어오려면 다음과 같이 합니다.
	$objSession = new CGI::Session(undef, (scalar $objCookies{'CGISESSID'}->value), {Directory=>'/tmp'});
	
	if ($objSession->param('member_id') eq undef)
	{
		# 세션 객체에 로그인한 ID가 없으면 로그인 실패
		$success = 0;
	}
	elsif ($objSession->param('member_password') eq undef)
	{
		# 세션 객체에 로그인한 암호가 없으면 로그인 실패
		$success = 0;
	}
	else
	{
		# 세션 객체에 로그인한 ID, 암호가 모두 있으면 로그인 성공
		$success = 1;
	}
}
else
{
	# 쿠키에 CGISESSID 항목이 없으면 로그인 불가
	$success = 0;
}

print "Content-type: text/html;charset=UTF-8\n\n";
print "<!doctype html>";
print "<html lang=\"ko\">";
print "<head>";
print "<meta charset=\"utf-8\" />";
print "<title>membership</title>";
print "</head>";
print "<body>";
if ($success eq 0)
{
	# 로그인 불가능하다면
	print "<p style=\"text-align: center;\">로그인되지 않았습니다.</p>";
	print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
}
else
{
	# 로그인 성공이면
	print "<p style=\"text-align: center;\">환영합니다. ", $objSession->param('member_id'), "님!</p>";
	print "<p style=\"text-align: center;\"><a href=\"logout.cgi\">로그아웃</a></p>";
}
print "</body>";
print "</html>";

 

logout.php

 세션을 삭제하여 로그아웃 처리합니다.

 session_start();을 사용하여 기존 세션을 불러오고 session_destroy();을 호출하여 불러온 세션을 파괴합니다.


#!/usr/bin/perl

use CGI qw/:standard/; # CGI 모듈을 사용합니다.
use CGI::Cookie; # 쿠키 모듈을 사용합니다.
use CGI::Session; # 세션 모듈을 사용합니다.

my $objCGI = CGI->new; # CGI 객체를 새로 생성합니다.
my %objCookies = undef; # 이 페이지로 전달된 쿠키 객체입니다.
my $objCookie = undef; # 삭제된 세션 ID에 대해 클라이언트 쿠키에도 삭제를 수행합니다.
my $objSession = undef; # 세션 객체입니다.
my $success = 0; # 로그인 성공 시 1, 아니면 0이 보관될 변수입니다.

%objCookies = fetch CGI::Cookie;

if ($objCookies{'CGISESSID'} ne undef)
{
	# 세션 ID를 가지고 기존에 보관된 세션을 읽어오려면 다음과 같이 합니다.
	$objSession = new CGI::Session(undef, (scalar $objCookies{'CGISESSID'}->value), {Directory=>'/tmp'});
	if ($objSession ne undef)
	{
		# 서버에서 세션을 삭제함.
		$objSession->delete();
		$success = 1;
	}
	else
	{
		$success = 0;
	}
}
else
{
	$success = 0;
}

# 클라이언트에도 삭제된 세션 ID가 남아있지 않도록 쿠키 삭제
$objCookie = new CGI::Cookie(-name=>'CGISESSID', -value=>'', -expires=>'-12h');

print "Set-Cookie: ", $objCookie->as_string, "\n";
print "Content-type: text/html;charset=UTF-8\n\n";
print "<!doctype html>";
print "<html>";
print "<head>";
print "<meta charset=\"utf-8\" />";
print "<title>로그아웃</title>";
print "</head>";
print "<body>";
if ($success eq 0)
{
	print "<p style=\"text-align: center;\">로그아웃 오류</p>";
	print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
}
else
{
	print "<p style=\"text-align: center;\">로그아웃 성공</p>";
	print "<p style=\"text-align: center;\"><a href=\"login.cgi\">로그인 하기</a></p>";
}
print "</body>";
print "</html>";

 

0 Comments
댓글쓰기 폼