[07] php 셋팅, mysql 연동, 계정 인증, Web 인증방식, cookie 이용 인증 및 logout

|


- 2015.03.17

 


1. php 연동


1) php.ini 파일 수정


# vi /etc/php.ini
    457 register_globals = On
    462 register_long_arrays = On


# service httpd restart


* register_globals : 전역변수 사용 가능 설정 - $id, $pw 등을 사용하기 위함

 

 


2) php 기본 사용법


<?
     $var = 0;     # 변수 선언 시 $ 를 붙이면 된다. type 지정 및 선언 필요 없음


?>    #  <-  이 안에 php 내용 삽입

 

 


3) 출력 확인


변수를 받아 출력 되는지 확인


# vi login_check.php
      1 <?
      2
      3   echo "id: $id";
      4   echo "<br>";
      5   echo "pw: $pw";
      6
      7 ?>


login.html 에서 확인 해보면 정상적으로 작동한다.

 

 


4) php변수


- 글로별 변수 : get, post 방식 상관 없이 처리 가능
- $_GET[] : get 방식으로 데이터가 전달 된 경우
- $_POST[] : post 방식으로 데이터가 전달 된 경우

 

 


[ 예제 ]


# vi login_check.php
      1 <?
      2
      3   echo "id: $id";
      4   echo "<br>";
      5   echo "pw: $pw";
      6
      7   echo "<br>";
      8   echo "<br>";
      9
     10   echo "id: $_GET[id]";
     11   echo "<br>";
     12   echo "pw: $_GET[pw]";
     13
     14   echo "<br>";
     15   echo "<br>";
     16
     17   echo "id: $_POST[id]";
     18   echo "<br>";
     19   echo "pw: $_POST[pw]";
     20
     21 ?>

 


- POST 방식


http://192.168.133.142/login_check.php 에서 전송하면 POST 결과 확인 가능

 


- GET 방식


현재 login.html 소스코드가 POST 방식이기 때문에 아래 url을 통해 확인 가능


http://192.168.133.142/login_check.php?id=asdf&pw=asdf

 


* Tip


php 는 컴파일이 없기 때문에 에러메세지가 따로 나오지 않는다.
눈으로 소스코드를 찾아보거나 명령어 방법으로 에러를 찾아야 한다.

 

 

 

 


2. php와 mysql


1) mysql 관련 library in php


- mysql_connect() : mysql server 접속
     server : localhost
     username : root
     password : xxxx


- mysql_select_db() : 사용할 DB 선택
     DB_name : test
     file descriptor : DB id - mysql_connect() 를 통해 반환됨


- mysql_query() : 쿼리 전송
     query : 실행할 쿼리


- mysql_fetch_array() : 쿼리 결과를 배열 형태로 반환
     result : 쿼리 실행 결과
     상수 : 배열의 형태
                    MYSQL_NUM         - 숫자로 가져옴
                    MYSQL_ASSOC     - field 값으로 가져옴
                    MYSQL_BOTH        - 둘 다로 가져옴

 


* 쿼리 실행 결과를 가져올 수 있는 또 다른 함수


- mysql_fetch_row()
- mysql_fetch_assoc()

 


ex)


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );
      3   mysql_select_db( 'test', $DB );
      4
      5 ?>


=>
# mysql -u root -p
mysql> use test;


까지 진행 된 상황.

 

 


[ 예제 ]


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                # DB 접속
      4
      5   $sql = "select * from user";                          # query 실행
      6   $result = mysql_query( $sql );                        # 결과를 result에 저장
      7
      8   while( $row = mysql_fetch_array( $result, MYSQL_NUM ) ) {     # row에 NULL값이 들어갈 때까지 반복
      9     echo "num: $row[0] name: $row[1] id: $row[2] pw: $row[3]";  # 반복문 없다면 첫번째 열만 출력함
     10     echo "<br>";
     11   }
     12
     13 ?>

 

 

 


2) 인증 예제


id & pw 인증


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' )                                   ;      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                                                      # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";       # query 실행
      6   $result = mysql_query( $sql );                                                                 # 결과를 result에 저장
      7
      8   #$row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );                                                     # result는 몇열인가?
     11   echo $count;                                                                                           # 조건 맞는 열의 개수 저장하여 출력
     12
     13 ?>


=> http://192.168.133.142/login_check.php?id=admin&pw=xxxx   확인 시 1 이 나온다. 이를 이용하여 아래처럼 꾸며보자.

 


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );                                            # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                                                         # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";           # query 실행
      6   $result = mysql_query( $sql );                                                                     # 결과를 result에 저장
      7
      8   #$row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );                                                         # result는 몇열인가?
     11   if ( $count > 0 ) {
     12     header('location: http://192.168.133.142/login.html');
     13   }
     14   else {
     15     echo "authentication fail... ";
     16   }
     17
     18 ?>


=> 인증은 된다. but 일반적으론 tcp 세션이 끊기기 전까지 인증이 유지되어야 하는데 여기선 그렇지 못하다.

 

 

 


3. Web 인증 방식


1) TCP 통신


연결을 계속 유지시키지는 않음
세션을 맺고 페이지를 모두 받아오면 바로 세션을 끊는다.

 

 


2) cookie, session


인증된 사용자임을 알기 위해 서버가 제공해주는 것들

 


* php 내의 이미 선언 되어 있는 변수


$_COOKIE[]
$_SESSION[]

 

 


3) cookie 굽기


- setcookie()
     cookie name
     cookie value
     expire time
     path
     (option) domain
     (option) security

 


# vi login_check.php
      1 <?
      2   $DB = mysql_connect( 'localhost', 'root', 'a' );      # mysql Server 접속
      3   $ret = mysql_select_db( 'test', $DB );                # DB 접속
      4
      5   $sql = "select * from user where id='$id' and pw=password('$pw')";    # que        ry 실행
      6   $result = mysql_query( $sql );                # 결과를 result에 저장
      7
      8 #  $row = mysql_fetch_array( $result, MYSQL_NUM );
      9
     10   $count = mysql_num_rows( $result );           # result는 몇열인가?
     11   if ( $count > 0 ) {
     12     setcookie('cookie', $pw, 0, '/');           # cookie 굽기, 만료 시간 없음
     13   }
     14   header('location: http://192.168.133.142/login.php');
     15
     16 ?>

 


# vi login.html
      1 <?
      2   if( !$_COOKIE[cookie] ) {
      3 ?>
      4 <html>
      5 <head>
      6         <title> Log In </title>
      7 </head>
      8
      9 <body>
     10         <form method=POST action=login_check.php>
     11                 id <input type="text" name="id"><br>
     12                 pw <input type="password" name="pw"><br>
     13                 <input type="submit" value="Login">
     14         </form>
     15 </body>
     16 </html>
     17
     18
     19 <?
     20   }
     21   else {
     22     echo "already login...";
     23   }
     24 ?>


html 파일을 php로 바꿔준다.


# mv login.html login.php


# vi index.html
     17                                         <li> <a href="login.php">Log In</a> <        /li>

 

 


4) logout


아래와 같이 Logout 버튼을 만들 수 있다.


# vi login.php
     21   else {
     22     echo "already login...";
     23     echo "<br>";
     24     echo "<a href='logout.php'> Logout </a>";
     25   }

 


# vi logout.php
      1 <?
      2   setcookie( 'cookie', '', 0, '/');
      3   header('location: http://192.168.133.142/login.php');
      4 ?>


=> cookie의 value를 초기화해서 쓸모 없는 cookie로 바꿔버림.


 

 

And