본문 바로가기

Web Development/PHP

[PHP] 로그인(login) 프로그램 구현

로그인 처리 프로그램 개발

웹사이트에 방문한 여러 사용자중에서
회원과 비회원을 분별하기위해 로그인 기술을 사용한다.

로그인을 통해 얻어지는 세션변수를 통해
같은 PHP파일에서 다른 결과물을 사용자에게 출력할수 있다.

 

예를들어 daum.net에 접속시 비회원은 메일을 보낼수 있는 버튼이 있지만
비회원은 메일을 보낼수 있는 버튼이 보이지 않는것이 로그인 기술을 사용한것이다.

 

보통 로그인 처리 프로그램은 쿠키변수 또는 세션변수로 처리할수 있습니다.

로그인처리 프로그램은 보안에 신경써야 하기때문에 보통 세션변수를 사용합니다.

왜그럴까요? 한번 생각해봅시다. (*^-^)(^-^*)☆

 

로그인 처리 프로그램 내/외부 처리 절차

 

1. 로그인폼을 접속합니다.

2. 로그인폼에 아이디/패스워드를 입력후 로그인버튼을 클릭합니다.

3. 입력한 아이디/패스워드로 인증처리를 하여 유효한지 판단합니다.

4. 계정이 유효하다면 로그인후 페이지로 이동합니다.

5. 계정이 유효하지 않다면 로그인폼으로 이동합니다.

 

로그인 처리 프로그램 파일 실행 절차

 

index.php -> login_ok.php -> index.php

 

기본 로그인 처리 프로그램 예제

 

※ 파란색은 주석입니다.

 

index.php

 

<?

 //# 세션변수를 사용하기위해 session_start(); 함수 실행 #//
 session_start();

?>

 

<script language="javascript">
<!--

 //# "로그인하기" 클릭했을때 호출되는 사용자 정의 함수 #//
 function login_send()
 {
  form = document.login_form;
  if (form.USERID.value == "")
  {
   alert("아이디 입력 요망");
   form.USERID.focus();
   return false;
  }
  else if(form.PASSWD.value == "")
  {
   alert("비밀번호 입력 요망");
   form.PASSWD.focus();
   return false;
  }
  else
  {
   return true;
  }
 }

 

//-->
</script>


<? if($_SESSION["session__id"]) { //# 세션 변수가 존재하면 실행 #// ?>

 <table align="center" border="1" bgcolor="pink" cellpadding="0" cellspacing="0" width="400">
  <tr align="center" height="30">
   <td>SESSION 아이디</td>
   <td><?=session_id();?></td>
  </tr>
  <tr align="center" height="30">
   <td>SESSION 파일 저장경로</td>
   <td><?=session_save_path();?></td>
  </tr>
  <tr align="center" height="40">
   <td colspan="2"><input type="button" value="   로그아웃하기   " onClick="location.href='login_ok.php?logout=yes';"></td>
  </tr>
 </table>

<?

//# 세션변수가 존재하지 않는다면 실행

}else{

?>

 <form name="login_form" method="post" action="login_ok.php" onSubmit="return login_send();">
 <table align="center" border="0" bgcolor="pink" cellpadding="0" cellspacing="0" width="200">
  <tr align="center" height="30">
   <td>아 이 디</td>
   <td><input type="text" name="USERID" style="width:100px;"></td>
  </tr>
  <tr align="center" height="30">
   <td>패스워드</td>
   <td><input type="password" name="PASSWD"  style="width:100px;"></td>
  </tr>
  <tr align="center" height="40">
   <td colspan="2"><input type="submit" value="     로그인하기     "></td>
  </tr>
 </table>
 </form>

<? } ?>

 

login_ok.php

 

<?

 //# 세션변수를 사용하기위해 session_start(); 함수 실행 #//
 session_start();

//# logout변수의 값이 yes넘어오면 실행 #// 
 if($logout == "yes")
 {
  session_unset();
  echo "<script>alert('로그아웃성공');location.href='index.php';</script>";
 }

//# logout변수의 값이 넘어오지 않으면 실행 #// 
 else
 {

  //# USERID 변수의 값과 PASSWD 변수의 값이 아이디값과 패스워드값과 같다면 실행  #//
  if((trim($USERID) == "byc") && (trim($PASSWD) == "byc"))
  {
   $_SESSION["session__id"]   =  $USERID;
   $_SESSION["session__pw"] =  $PASSWD;
   Header("Location:index.php");
  }

  //# USERID 변수의 값과 PASSWD 변수의 값이 하나라도 다르다면 실행  #//
  else
  {
   echo "<script>alert('로그인실패');location.href='index.php';</script>";
  }
 }

?>

 

★ 위의 로그인 처리 프로그램을 PHP파일내에서 정적인 인증처리가 아닌
DBMS을 이용한 동적인 인증처리로 바꾸어봅시다.★

이것의 단점은 하나의 계정만 비교가 가능하다는것이다.

다수의 계정을 비교하기위해서는 DBMS을 이용한 동적인 인증처리 구현해야 한다.

 

DBMS을 이용한 동적인 인증처리를 위한 준비사항

 

1. PHP와 연동할 DBMS에 계정관련 TABLE을 생성한다.

2. 생성한 TABLE에 하나의 레코드를 삽입한다. (ex : 아이디,패스워드)

3. PHP파일에서 사용자의 아이디와 패스워드를 체크하는 부분인 login_ok.php 파일을 수정합니다. 
아랫부분을 찾아서 DB와 연동하여 값을 비교하는 방식으로 바꿉니다.

 

아랫부분

if((trim($USERID) == "byc") && (trim($PASSWD) == "byc"))
{
$_SESSION["session__id"]   =  $USERID;
$_SESSION["session__pw"] =  $PASSWD;
Header("Location:index.php");
}

 

※ 백운산 철학원 관리자로그인 페이지 참고하세요.

※ 회사에서 맡겨진 업무라고 생각하고 해보세요.

단순히 PHP파일에서 정해진 문자열로 아이디/패스워드를 비교하는 프로그램입니다.


아래 소스는
그프로그램(PHP파일 문자열비교)을 DB와 연동해서
DB안에 있는 값으로 아이디/패스워드를 비교하는 프로그램으로 바꾼 최종 산출물입니다.

 

index.php 소스

 

<?
 
 //# 세션 스타트 #//
 session_start();
 
 //# DB연결 설정 #//
 $link = mysql_connect("localhost","byc","freely21c");
 mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
 $qry_result = mysql_query(" select * from login ",$link);
 $login_row = mysql_fetch_array($qry_result);
 //# DB연결 설정 #//
 
?>

<script language="javascript">
<!--

 function login_send()
 {
  form = document.login_form;
  if (form.id.value == "")
  {
   alert("아이디 입력 요망");
   form.id.focus();
   return false;
  }
  else if(form.pw.value == "")
  {
   alert("비밀번호 입력 요망");
   form.pw.focus();
   return false;
  }
  else
  {
   return true;
  }
 }


//-->
</script>


<!--로그인 되었을때의 처리 -->
<?
 if($_SESSION["session_id"])
 {
?>
 <table align="center" border="1" bgcolor="pink" cellpadding="0" cellspacing="0" width="400">
  <tr align="center" height="30">
   <td>SESSION 아이디</td>
   <td><?=session_id();?></td>
  </tr>
  <tr align="center" height="30">
   <td>SESSION 파일 저장경로</td>
   <td><?=session_save_path();?></td>
  </tr>
  <tr align="center" height="40">
   <td colspan="2"><input type="button" value="   로그아웃하기   " onClick="location.href='login_ok.php?logout=yes';"></td>
  </tr>
 </table>
<?
 } else {
?>
<!-- 로그아웃되었을때의 처리 -->
 <form name="login_form" method="post" action="login_ok.php" onSubmit="return login_send();">
 <table align="center" border="0" bgcolor="pink" cellpadding="0" cellspacing="0" width="200">
  <tr align="center" height="30">
   <td>아 이 디</td>
   <td><input type="text" name="id" style="width:100px;" value=""></td>
  </tr>
  <tr align="center" height="30">
   <td>패스워드</td>
   <td><input type="password" name="pw"  style="width:100px;" value=""></td>
  </tr>
  <tr align="center" height="40">
   <td colspan="2"><input type="submit" value="     로그인하기     "></td>  
  </tr>
 </table>
 </form>
<?
 }
?>

 

login.php 소스

 

<?
 
 //# 세션 스타트 #//
 session_start();
 
 //# DB연결 설정 #//
 $link = mysql_connect("localhost","byc","freely21c");
 mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
 $qry_result = mysql_query(" select * from login ",$link);
 $login_row = mysql_fetch_array($qry_result);
 //# DB연결 설정 #//

 //## 사용자 로그아웃 시도 ##//
 if($logout == "yes")
 {
  //# 모든세션값 소멸 #//
  session_unset();
  echo "<script>alert('로그아웃성공');location.href='index.php';</script>";
 }
 //## 사용자 로그인 시도 ##//
 else
 {
  //# 아이디/패스워드 체크(대소문자 비교) #//
  if($login_row[id] == $id && $login_row[pw] == $pw)
  {
   $_SESSION["session_id"] =  $id;
   $_SESSION["session_pw"] =  $pw;
   //# 해당페이지이동(Header앞에 공백,출력문자열 있으면 에러) #//
   Header("Location:index.php");
  }
  else
  {
   echo "<script>alert('로그인실패');location.href='index.php';</script>";
  }
 }

?>

현재 진행하는 로그인프로그램에 기능추가하기

 

현재까지 단순히 db에 있는 아이디/패스워드 값을 비교해서
로그인/로그아웃이 되는 로그인처리 프로그램을 만들어봤습니다.

이번스터디에는 기능추가를 2개 해볼것입니다.

패스워드바꾸기

(보통 사이트에서는 아이디는 못바꾸며 패스워드만 변경가능합니다.
로그인된 상태에서 패스워드를 바꾸는 기능을 추가할것입니다.)

 

아이디를 이용해 패스워드 알아내기

(보통 사이트에서는 아이디와주민번호를 이용해서 해당 이메일로 패스워드를 보내주지만
우리는 현재 상황에 맞게 아이디를 입력하면 패스워드를 출력해주는 형식으로 기능추가를 할것입니다.)

 

기능추가를 하기전에 해당 기능에 필요한 SQL 생각해보기

※ DB와 관련된 기능추가는 항상 SQL을 먼저 생각해본후
구현해보면 좀더 정확하고 빠르게 구현할수 있습니다.

※ 아래 QUERY는 로그인 정보 테이블이 login 이라고 가정하고 작성하였습니다.

 

패스워드바꾸기

select count(*) from login where id = '아이디';

update login set pw = '패스워드';

 

아이디를 이용해 패스워드 알아내기

select pw from login where id = '아이디';

 

※ 위의 QUERY외에 또 필요한 QUERY가 있는지 생각BOA~

 

기능추가를 위해 소스코딩을 할 PHP파일은?

먼저 로그인이 된상태에서 필요한 기능추가는 패스워드변경이며

로그아웃이 된상태에서 필요한 기능추가는 패스워드알아내기입니다.

패스워드변경기능은 로그인폼파일에 소스가 추가되며

패스워드알애닉기능도 로그인폼파일에 소스가 추가됩니다.

 

기능추가된 소스

index.php

<?
 
 //# 세션 스타트 #//
 session_start();

?>

<script language="javascript">
<!--

 function login_send()
 {
  form = document.login_form;
  if (form.id.value == "")
  {
   alert("아이디 입력 요망");
   form.id.focus();
   return false;
  }
  else if(form.pw.value == "")
  {
   alert("비밀번호 입력 요망");
   form.pw.focus();
   return false;
  }
  else
  {
   return true;
  }
 }

function OpenWindow(file_name,width,height)
{
 window.open(file_name,'open_win1','top=100,left=100,width='+width+',height='+height+',scrollbars=no');
}
//-->
</script>


<!--로그인 되었을때의 처리 -->
<?
 if($_SESSION["session_id"])
 {
?>
 <table align="center" border="1" bgcolor="pink" cellpadding="0" cellspacing="0" width="400">
  <tr align="center" height="30">
   <td>SESSION 아이디</td>
   <td><?=session_id();?></td>
  </tr>
  <tr align="center" height="30">
   <td>SESSION 파일 저장경로</td>
   <td><?=session_save_path();?></td>
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="button" value="   패스워드변경   " onClick="OpenWindow('pwchange.php','300','130');"></td>
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="button" value="   로그아웃하기   " onClick="location.href='login_ok.php?logout=yes';"></td>
  </tr>

 </table>
<?
 } else {
?>
<!-- 로그아웃되었을때의 처리 -->
 <form name="login_form" method="post" action="login_ok.php" onSubmit="return login_send();">
 <table align="center" border="0" bgcolor="pink" cellpadding="0" cellspacing="0" width="200">
  <tr align="center" height="30">
   <td>아 이 디</td>
   <td><input type="text" name="id" style="width:100px;" value=""></td>
  </tr>
  <tr align="center" height="30">
   <td>패스워드</td>
   <td><input type="password" name="pw"  style="width:100px;" value=""></td>
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="button" value="   패스워드찾기    " onClick="OpenWindow('pwfind.php','300','100');"></td>  
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="submit" value="     로그인하기     "></td>  
  </tr>
 </table>
 </form>
<?
 }
?>

 

login_ok.php

<?
 
 //# 세션 스타트 #//
 session_start();
 
 //# DB연결 설정 #//
 $link = mysql_connect("localhost","byc","freely21c");
 mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
 $qry_result = mysql_query(" select * from login ",$link);
 $login_row = mysql_fetch_array($qry_result);
 //# DB연결 설정 #//

 //## 사용자 로그아웃 시도 ##//
 if($logout == "yes")
 {
  //# 모든세션값 소멸 #//
  session_unset();
  echo "<script>alert('로그아웃성공');location.href='index.php';</script>";
 }
 //## 사용자 로그인 시도 ##//
 else
 {
  //# 아이디/패스워드 체크(대소문자 비교) #//
  if($login_row[id] == $id && $login_row[pw] == $pw)
  {
   $_SESSION["session_id"] =  $id;
   $_SESSION["session_pw"] =  $pw;
   //# 해당페이지이동(Header앞에 공백,출력문자열 있으면 에러) #//
   Header("Location:index.php");
  }
  else
  {
   echo "<script>alert('로그인실패');location.href='index.php';</script>";
  }
 }

?>

 

pwchange.php

<?

 //# DB연결 설정 #//
 $link = mysql_connect("localhost","byc","freely21c");
 mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
 $qry_result = mysql_query(" select * from login ",$link);
 $login_row = mysql_fetch_array($qry_result);
 //# DB연결 설정 #//
 
?>

<script language="javascript">
<!--

 function pw_send()
 {
  form = document.pw_form;
  if (form.pw.value == "")
  {
   alert("패스워드를 입력해주십시오.");
   form.pw.focus();
   return false;
  }
 }

//-->
</script>

<form name="pw_form" method="post" action="process.php?mode=pw_change" onSubmit="return pw_send();">
 <table align="center" border="1" bgcolor="skyblue" cellpadding="0" cellspacing="0" width="240">
  <tr height="30">
   <td>아이디</td>
   <td>&nbsp;<?=$login_row[id]?></td>
  </tr>
  <tr height="30">
   <td>패스워드</td>
   <td>&nbsp;<input type="password" name="pw" value="<?=$login_row[pw]?>" size="21"></td>
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="submit" value="비밀번호 수정하기"></td>
  </tr>
 </table>
 </form>

 

process.php

<?

 //# DB연결 설정 #//
 $link = mysql_connect("localhost","byc","freely21c");
 mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
 //# DB연결 설정 #//

 //# 패스워드 변경 처리 #//
 if ($mode == "pw_change")
 {
  $qry_result = mysql_query(" update login set pw = '$pw' ",$link);
  echo "<script>alert('변경완료');window.close();</script>";
 }
 else if($mode == "pw_find")
 {
  $qry_result = mysql_query(" select * from login where id = '$id' ",$link);
  $row = mysql_fetch_array($qry_result);
  
  if(empty($row))
  {
  echo "<script>alert('아이디를 찾을수 없음');window.close();</script>";
  }
  else
  {
  echo "<script>alert('당신의 패스워드는 $row[id] 입니다.');window.close();</script>";
  }
 }
 
?>

 

pwfind.php

<script language="javascript">
<!--

 function pw_send()
 {
  form = document.pw_form;
  if (form.id.value == "")
  {
   alert("패스워드를 찾을 아이디를 입력해주십시오.");
   form.id.focus();
   return false;
  }
 }

//-->
</script>

<form name="pw_form" method="post" action="process.php?mode=pw_find" onSubmit="return pw_send();">
 <table align="center" border="1" bgcolor="skyblue" cellpadding="0" cellspacing="0" width="240">
  <tr height="30">
   <td>아이디</td>
   <td>&nbsp;<input type="text" name="id" ></td>
  </tr>
  <tr align="center" height="30">
   <td colspan="2"><input type="submit" value="패스워드 찾기"></td>
  </tr>
 </table>
 </form>

'Web Development > PHP' 카테고리의 다른 글

[PHP] 방명록 프로그램 구현  (0) 2009.06.06
[PHP] DB의 데이타를 게시판형식으로...  (1) 2009.06.06
[PHP] DB 연동하기  (0) 2009.06.06
[PHP] 카운터 만들기  (0) 2009.06.05
[PHP] 함수에 대해서  (0) 2009.06.05