관리 메뉴

tapito.tistory.com

쿠키를 이용한 Perl(CGI) 로그인/로그아웃 소스 본문

Common Gateway Interface/Perl

쿠키를 이용한 Perl(CGI) 로그인/로그아웃 소스

Tapito 2018.07.12 17:20

 Perl(CGI)의 쿠키를 이용한 로그인/로그아웃 소스입니다.

login.cgi

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


#!/usr/bin/perl

print "Content-type: text/html; charset=UTF-8\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와 암호를 비교하여 로그인 성공 여부를 판별합니다.

Perl에서 POST 방식으로 전달된 데이터를 읽는 방법에 대해서는 이 포스트(http://tapito.tistory.com/598)를 참고하세요.


#!/usr/bin/perl

use CGI qw/:standard/;
use CGI::Cookie;

$objCGI = CGI->new;
$member_id = "user";
$member_password = "password";

if (($objCGI->param('member_id') eq $member_id) && ($objCGI->param('member_password') eq $member_password))
{
	# 유효기간 1시간짜리 쿠키 생성
	$objCookie1 = new CGI::Cookie(-name=>'member_id', -value=>($objCGI->param('member_id')), -expires=>'+1h');
	$objCookie2 = new CGI::Cookie(-name=>'member_password', -value=>($objCGI->param('member_password')), -expires=>'+1h');

	# 쿠키는 HTML 의 본문에 앞서 맨 앞 헤더 부분에 출력되어야 합니다.
	print "Set-Cookie: ", $objCookie1->as_string, "\n";
	print "Set-Cookie: ", $objCookie2->as_string, "\n";
}

print "Content-type: text/html; chatset=UTF-8\n\n";
print "<!doctype html>";
print "<html>";
print "<head>";
print "<meta charset=\"utf-8\" />";
print "<title>로그인 처리</title>";
print "</head>";
print "<body>";
# ID가 전달되었는지 검사
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>";
}
# ID와 암호가 전달되었다면
else
{
	# ID를 잘못 입력 시
	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/;
use CGI::Cookie;

# 쿠키가 있는지 확인합니다.
# %objCookies = parse CGI::Cookie($ENV{'COOKIE'}); 로도 읽어올 수 있습니다.
%objCookies = fetch CGI::Cookie;

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 (($objCookies{'member_id'} ne undef) && ($objCookies{'member_password'} ne undef))
{
	$member_id = $objCookies{'member_id'}->value;
	$member_password = $objCookies{'member_password'}->value;
	print "<p style=\"text-align: center;\">환영합니다. $member_id 님</p>";
	print "<p style=\"text-align: center;\"><a href=\"logout.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>";

 

실행 결과 :

 

logout.cgi

 쿠키를 강제로 만료시켜 로그인 정보를 지우는 것으로 로그아웃을 수행합니다. 만일 로그인 된 상태가 아니어서 쿠키에 로그인 정보가 없는 경우 로그인 페이지로 안내합니다.


#!/usr/bin/perl

use CGI qw/:standard/;
use CGI::Cookie;

$valid_logout = 0;

# 쿠키가 있는지 확인합니다.
# %objCookies = parse CGI::Cookie($ENV{'COOKIE'}); 로도 읽어올 수 있습니다.
%objCookies = fetch CGI::Cookie;

if (($objCookies{'member_id'} ne undef) || ($objCookies{'member_password'} ne undef))
{
	# 쿠키 지우기: 과거 시점으로 만료날짜 설정하여 클라이언트로 전송
	$objCookie1 = new CGI::Cookie(-name=>'member_id', -value=>'', -expires=>'-12h');
	$objCookie2 = new CGI::Cookie(-name=>'member_password', -value=>'', -expires=>'-12h');
	$valid_logout = 1;

	# 쿠키는 HTML 의 본문에 앞서 맨 앞 헤더 부분에 출력되어야 합니다.
	print "Set-Cookie: ", $objCookie1->as_string, "\n";
	print "Set-Cookie: ", $objCookie2->as_string, "\n";
}
else
{
	$valid_logout = 0;
}

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 ($valid_logout 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
댓글쓰기 폼