세션

값을 전달하지 않고 값을 계속 유지시켜주는 방식

*세션에 많은 정보를 저장하면 안된다.

 

세션 VS 쿠키

세션에 저장되는 정보는 서버쪽에 저장

쿠키는 브라우저에 저장 (해킹 쉬움)

 

a.php

<?
  session_start();

  $_SESSION["name"] = '학생';
  $_SESSION["passwd"] = '암호';

  $name=$_SESSION["name"];
  $passwd= $_SESSION["passwd"];

  echo(" name = $name <br>");
  echo(" passwd = $passwd <br>");

  echo("<a href='./b.php'>b.php</a>");
?>

 

b.php

<?
  session_start();

  $_SESSION["name"] = '학생';
  $_SESSION["passwd"] = '암호';

  $name=$_SESSION["name"];
  $passwd= $_SESSION["passwd"];

  echo(" name = $name <br>");
  echo(" passwd = $passwd <br>");

  echo("<a href='./b.php'>b.php</a>");
?>

a.php
b.php

php.ini에 'session.auto_start = 1'로 설정하면 session_start() 함수를 생략 할 수 있다.

$_SESSION["name"] 변수와 $_SESSION["passwd"] 변수에 세션 값을 저장한다. 

이들 변수는 session_destroy() 함수나 session_unset() 함수가 호출되기 전까지 계속 유지된다.

 

▶ 세션 관련 함수

• bool session_start ( void )

  - 세션을 시작한다.
  - 매개 변수 없이 쓰인다.
  - session.auto_start=1로 설정하면 함수를 자동으로 실행한 것과 동일하다.
  - $_SESSION 배열을 이용해서 세션 변수를 등록한다.

 

• bool session_destroy( void )
  - 세션을 종료한다.
  - 매개 변수 없이 쓰인다.
  - 이후 세션을 이용하려면 새로운 세션을 시작해야 한다.

 

• void session_unset ( void )
  - 세션 변수를 모두 초기화 한다.
  - 매개 변수와 반환 값이 모두 없다.
  - 세션자체를 없애는 것은 아니다.

 

• string session_id ( void )
  - 세션 ID를 반환한다.

 

세션을 이용한 인증 처리

실선 : 마우스 클릭 / 점선 : 자동으로

• 테이블 입출력 프로그램
  - st_vi.php : student 테이블 출력 프로그램
  - st_in.html : student 테이블 입력 폼
  - st_in.php : student 테이블 입력 프로그램
• 인증 정보(계정) 등록 프로그램
  - id.html : 계정 등록 폼
  - id.php : 계정 등록 프로그램
• 로긴 프로그램
  - check.html : 로긴 정보 입력 폼
  - check.php : 로긴 프로그램

 

세션을 이용한 인증 처리 실습

인증을 위해 미리 테이블을 생성한다.

오라클에 접속해서 생성한다.

SQL> CREATE TABLE id(
  2  id varchar2(10),
  3  passwd varchar2(32) CONSTRAINT id_nu_passwd NOT NULL,
  4  CONSTRAINT user_pk_id PRIMARY KEY (id)
  5  );

테이블이 생성되었습니다.

 

• 계정 등록 프로그램

 

id.html

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> 계정등록 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="id" action="id.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">ID</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="id"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">passwd</p></td>
    <td>&nbsp;&nbsp;<input type="password" name="passwd"></td>
  </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
<table>
</form>
</body></html>

 

id.php

<?
  require('conn.php');

  $id = $_POST["id"];
  $passwd = $_POST["passwd"];

  $sql="insert into id (id, passwd)
        values ('$id', DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2))";

  $result=oci_parse($conn,$sql);
  $re=@oci_execute($result); // 입력된 값을 테이블에 저장한다.

  oci_free_statement($result);
  oci_close($conn);

  if(!$re){
    echo(" <script>
            window.alert('계정 등록 장애입니다.');
            history.go(-1);
            </script>
          ");
      exit;
    } // st_vi.php를 호출할 때 $id나 $passwd는 세션변수에 등록되었음으로
  else // 전달할 필요가 없다.
      echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
?>

 

• 로긴 프로그램
로긴 프로그램은 st_vi.php로부터 호출된다. st_vi.php의 [login] 버튼을 클릭하면 check.html을 호출하여 id와 패스워드를 입력 받는다. 

입력된 id와 패스워드는 POST방식으로 check.php에 전달된다.

 

check.html

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> login </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="login" action="check.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">ID</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="id"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">passwd</p></td>
    <td>&nbsp;&nbsp;<input type="password" name="passwd"></td>
  </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
<table>
</form>
</body></html>

 

check.php

<?
  session_start();
  require('conn.php');

  $id = $_POST["id"];
  $passwd = $_POST["passwd"];

  $sql="select * from id
        where id = '$id'
        and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

  $result=oci_parse($conn,$sql);
  $re=oci_execute($result);
  $row_num=oci_fetch_all($result,$row);
  oci_free_statement($result);
  oci_close($conn);

  if($row_num == 1){
    $_SESSION["id"] = $id;
    $_SESSION["passwd"] = $passwd;
    echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
  }
  else{
    echo(" <script>
            window.alert('잘못된 계정 정보입니다.');
            history.go(-1);
            </script>
        ");
    exit;
  }
?>

 

• 로그인이 안된 상태에서 접근 불가능

log.php

<?
session_start();

   if(empty($_GET["logout"]))
   {}
   else session_unset();

   $id = $_SESSION["id"];
   $passwd = $_SESSION["passwd"];

   require('conn.php');

   $sql="select * from id
      where id= '$id'
      and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

   $result=oci_parse($conn,$sql);
   $re=oci_execute($result);
   $row_num=oci_fetch_all($result,$row);

   if($row_num == 1)
   {
   }
   else
   {
      echo(" <script>
         window.alert('로그인이 필요합니다');
         history.go(-1);
         </script>
         ");
      }
?>

 

st_in.html

<?
  require('log.php')  // login이 안되어 있으면 접근 불가능한 것을 추가
?>

<html><head>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<title> student 입력폼 </title>
</head>
<body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
<form name="insert" action="st_in.php" method="POST">
<center>
<table border="0" width="250">
  <tr>
    <td width="50"><p align="center">학번</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="sno"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">이름</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="sname"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">성별</p></td>
    <td>&nbsp;&nbsp;남<input type="radio" name="sex" value="남">,
                    여<input type="radio" name="sex" value="여"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학과</p></td>
    <td>&nbsp;&nbsp;<select name="major" size="1">
                      <option value="화학">화학</option>
                      <option value="생물">생물</option>
                      <option value="물리">물리</option>
                      <option value="유공">유공</option>
                      <option value="식영">식영</option></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학년</p></td>
    <td>&nbsp;&nbsp;1<input type="radio" name="syear" value="1">,
                    2<input type="radio" name="syear" value="2">,
                    3<input type="radio" name="syear" value="3">,
                    4<input type="radio" name="syear" value="4"></td>
  </tr>
  <tr>
    <td width="50"><p align="center">학점</p></td>
    <td>&nbsp;&nbsp;<input type="text" name="avr"></td>
    </tr>
  <tr>
    <td colspan="2">
      <p align="center"><input type="submit" name="확인" value="확인"></p>
    </td>
  </tr>
</table>
</form>
</body></html>

 

로그인이 안된 상태에서 자료 입력하기를 바로 들어가려면 접근이 불가능하다.

 

• 테이블 입출력 프로그램
st_vi.php를 제외한 st_in.html과 st_in.php는 이전 소스와 동일해서 생략한다. st_vi.php는 로그인 상태와 로그인되지 않은 상태에 따라 출력 내용이 달라진다.

로그인 상태인 경우 데이터를 입력 버튼을 보여주지만 로그인이 아닌 상태에서는 로그인과 등록 메시지만 보여준다.

 

st_vi.php

<?
  //==========================로그인========================================
  session_start();

  if(empty($_GET["logout"])){}
  else session_unset(); // session_distroy 사용과 비교한다.

  $id = $_SESSION["id"];
  $passwd = $_SESSION["passwd"];

  require('conn.php');

  $sql="select * from id
        where id = '$id'
        and passwd = DBMS_CRYPTO.Hash(to_clob(to_char('$passwd')),2)";

  $result=oci_parse($conn,$sql);

  $re=oci_execute($result);
  $row_num=oci_fetch_all($result,$row);

  if($row_num == 1){ // 로긴 상태
      echo("<a href=./st_in.html>자료 입력하기</a>
            <a href=./st_vi.php?logout=$row_num>logout</a><hr>
      ");
  }
  else{ // 비로긴 상태
      echo(" <a href=./id.html>계정등록</a>
            <a href=./check.html>login</a><hr>");
  }

  //==========================자료입력========================================
  //echo("<a href=./st_in.html>자료 입력하기</a><hr>");

  //require('conn.php');

  //==========================삭제기능========================================
  $del=$_GET[del];        // $del 변수가 null이 아니면 행을 삭제하는 else절이 실행된다.
  if (empty($del)){}
  else {
	  $sql="delete from student where sno='$del'";
	  $result=oci_parse($conn,$sql);
	  oci_execute($result);
	  oci_free_statement($result);
	  }

  //==========================검색기능=========================================

    $search = $_GET[search];
	if (empty($search)) {
	 	$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
	 	     from student order by sno";
	 	$result=oci_parse($conn,$sql);
	 }
	else {
	 	$sql="select sno,sname,sex,major,syear,to_char(avr,'0.00') avr
	 	       from student
	 	       where sname like '%{$search}%' order by sno";
	 	$result=oci_parse($conn,$sql);
	 }
	 oci_execute($result);

  //==========================================================================


  $row_num=oci_fetch_all($result, $row);  // $row_num : 전제 행의 수
  //echo("Row의 개수는 $row_num 입니다.<br><hr>"); // 행은 컬럼명, 열은 행번호

  oci_free_statement($result);
  oci_close($conn);

   $scale=5;                           // 화면에 출력할 행의 개수
   $start = $_GET[start];
   if (empty($start)){$start=0;}    // 첫 화면은 0에서 시작, 배열의 키값은 0에서 시작

  echo("<table border='1'>");
  for($i=$start; $i<($start+$scale); $i++) {
   if ($i<$row_num){
     echo("
    	<tr>
    		<td width='50'><p align='center'>{$row['SNO'][$i]}</p></td>
    		<td width='80'><p align='center'>{$row['SNAME'][$i]}</p></td>
    		<td width='20'><p align='center'>{$row['SEX'][$i]}</p></td>
    		<td width='20'><p align='center'>{$row['SYEAR'][$i]}</p></td>
    		<td width='50'><p align='center'>{$row['MAJOR'][$i]}</p></td>
    		<td width='30'><p align='center'>{$row['AVR'][$i]}</p></td>
    		<td width='30'><a href=./st_vi.php?del={$row[SNO][$i]}>del</a></td>
    	</tr>
    	");
  	}
	}
  echo("</table><br>");


  $p=$start-$scale;     // 이전 화면의 시작 위치
  $n=$start+$scale;     // 다음 화면의 시작 위치

  if($p>=0)
    echo("<a href=./st_vi.php?start=$p&search=$search>[이전페이지]</a>&nbsp;&nbsp;");
  else
    echo("이전페이지&nbsp;&nbsp;");
  if($n<$row_num)
    echo("<a href=./st_vi.php?start=$n&search=$search>[다음페이지]</a>");
  else
    echo("다음페이지");

  //echo("<br>");
  //echo($search); // 확인하기 위해 search 변수 출력
  echo("<hr>");
  echo("$row_num 열이 검색됨<br><br>");
?>

<form name='search' method='get' action='st_vi.php'>
 검색창 &nbsp;<input type='text' name='search'>
		   <input type='submit' name='확인' value='확인'>
 </form>

실행결과

login 전

계정을 등록한다.

 

계정등록

계정을 등록하고 로그인을 클릭한다.

 

login

로그인이 된다.

 

login 후

로그인하면 자료 입력하기를 할 수 있다.

+ Recent posts