PHP Cookie / Session 생성 및 초기화

2017. 8. 18. 19:53WebHacking/Web


[ Cookie 발급 및 초기화 ]


[ /var/www/html/login.php ] - http://192.168.6.123/login.php 웹 페이지 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
<?php
 
    $user_info = array"user1" => "pass" , "user2" => "1234" );    
    // 인덱스명 : 아이디 / 요소값 : 비밀번호 / " DB역할 수행중 "
 
    if ( isset$_REQUEST[id] ) && isset$_REQUEST[pw] )) {     
   //id와 pw가 존재한다면? = 아이디와 비밀번호를 입력했다면?
 
        if ( $user_info[$_REQUEST[id] ] === $_REQUEST[pw] ) {        
        //$user_info배열의 인덱스와 요소값과 일치하자면?
                                                                    
        // 인증토큰(쿠키)을 발행해주자
 
          setcookie( "id"$_REQUEST[id], time()+86300"/" );        
            // 쿠키의 id를 $_REQUEST[id] 라는 값으로 초기화
          setcookie( "login_time"time(), time()+86300"/" );        
            // 쿠키의 login_time을 현재시간으로 초기화
          setcookie( "token"md5($_REQUEST[pw]), time()+86300"/" );    
            // 쿠키의 token을 비밀번호의 해쉬값으로 초기화
 
          echo "<script> alert('login success'); </script>";
 
        }else{                                                        
        // 아이디와 비밀번호가 일치하지 않는다
            echo "<script> alert('login failed');</script>";
        }
        echo '<meta http-equiv="refresh" content="0">';                
        // 새로고침
 
    }else{                                                         
     if ( !isset($_COOKIE[id]) && !isset($_COOKIE[login_time]) && !isset($_COOKIE[token])){
     // 웹 브라우저에 쿠키값이 존재하지 않으면 HTML소스코드 화면에 출력
 
?>
 
<!doctype html>
<html>
<head></head>
 
<body>
    <form method=POST action=login.php>
         ID : <input type="text" name="id" /><br/>
        PASSWORD :<input type="password" name="pw"/><br/>
         <input type="submit" value="Login"/>
    </form>
</body>
</html>
 
<?php
 
        }else{                                                      
        // 웹 브라우저에 쿠키가 존재한다면 다음 문장 출력
 
            echo "already login <br>";
            echo "<a href=logout.php> Logout </a>";
        }
    }
?>
 

cs


[ /var/www/html/logout.php ] - http://192.168.6.123/logout.php 웹 페이지 소스코드

1
2
3
4
5
6
7
8
9
10
11
 
<?php
 
    # 쿠키 파괴 하기
    setcookie( "id" , '' , time()-99999999 , "/" ); // 쿠키의 id에 '' 초기화
    setcookie( "login_time" , '' , time()-99999999 , "/" ); // 만료시간을 과거로 -> 사용x
    setcookie( "token" , '' , time()-99999999 , "/" ); // 적용범위 : root
 
?>
 
<meta http-equiv="refresh" content="0;url=http://192.168.6.123/login.php"/>
//cs


[ login.php 실행화면 ] 


아이디와 패스워드를 올바르게 입력하여야 웹 페이지에 접속할 수 있습니다

$user_info 배열에 저장되어 있는 값에 맞는 값을 입력해야 접속할 수 있습니다 ( DB역할을 해주고 있다 )


[ 웹 페이지에 cookie값 존재 ]


로그인이 되어서 쿠키가 발행된 상태입니다

쿠키가 존재하기 때문에 이전 페이지 화면과는 다른 화면이 출력됩니다

=> 쿠키가 있기 때문에 해당 사용자임을 인증하고, 또다시 로그인을 하지않는 편의성을 제공한다

로그아웃 버튼을 누르면 쿠키값들이 초기화됩니다


[ logout 클릭 => 쿠키 삭제 ]


쿠키값이 사라졌으므로 다시 로그인 하기위한 입력창이 화면에 출력됩니다


[ 와이어샤크 캡쳐화면 ]

[ 서버 -> 클라이언트 응답 패킷 ]


1> 클라이언트가 웹 페이지에 아이디와 비밀번호를 입력하고 접속합니다

2> 서버는 해당 정보가 맞는지 확인하고 쿠키값을 발행합니다

3> HTTP 헤더에 Set-Cookie 필드를 이용해서 사용자에게 전달한다

4> 쿠키값은 웹 브라우저에 저장됩니다


[ 클라이언트 -> 서버 웹 페이지 재요청 ]


1> 위에서 웹 브라우저에 한번 로그인 해서 쿠키값을 발행하였습니다 => 웹 브라우저에 쿠키값이 남아있

2> 새로고침하여 다시 웹 브라우저를 서버에게 요청하면서 Cookie필드에 쿠키값을 넣어서 서버로 전송한다

3> 해당 쿠키값이 서버에 저장되어있는 값과 일치하다면 로그인 되어진다



* 서버에서 클라이언트에게 쿠키를 발행한다

* 쿠키의 만료기간 전에 다음 로그인 시 클라이언트에서 서버에게 HTTP헤더에 쿠키값을 보내서 인증한다

=> 쿠키값으로만 인증하여 로그인이 이루어지는 방식

* 브라우저 콘솔창에서 document.cookie 에 쿠키값이 저장되어 있음을 확인할 수 있다

단점

1) 사용자의 개인 정보가 로컬 컴퓨터에 남는다

2) 쿠키의 유효기간동안에는 재인증없이 사용이 가능

=> 쿠키값이 타인에게 노출되면 악용이 가능하다

 



[ Session 생성 및 초기화 ]

< 세션관련함수 > - session_xxxx

1> session_start()    : 새로운 세션을 생성한다

세션을 사용하는 곳에서는 무조건 제일 먼저 사용되어져야 한다

2> 세션아이디가 쿠키를 통해서 발급된다

3> $_SESSION    : 세션에 사용자 정보를 저장한다

사용자정보은 $_SESSION변수를 통해서 관리된다


/var/www/html/login.php ] - http://192.168.6.123/login.php 웹 페이지 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<?php
 
    session_start();    // 새로운 세션을 하나 생성한다
 
    $user_info = array"user1" => "pass" , "user2" => "1234" );    
    // 인덱스명 : 아이디 / 요소값 : 비밀번호
 
    if ( isset$_REQUEST[id] ) && isset$_REQUEST[pw] )) {     
   //id와 pw가 존재한다면? = 아이디와 비밀번호를 입력했다면?
 
        if ( $user_info[$_REQUEST[id] ] === $_REQUEST[pw] ) {        
        //$user_info배열의 인덱스와 요소값과 일치하자면?
                                                    
            $_SESSION[id]=$_REQUEST[id];
            $_SESSION[login_time]=date('Y-m-d');
            
            echo "<script> alert('login success'); </script>";
 
        }else{                                                        
        // 아이디와 비밀번호가 일치하지 않는다
            echo "<script> alert('login failed');</script>";
        }
        echo '<meta http-equiv="refresh" content="0">';                
        // 새로고침
 
    }else{        
    // 로그인 하기 전, $_REQUEST변수에 아이디와 비밀번호가 저장되기 전                                                 
    echo "Cookie : ";
    print_r($_COOKIE);
    echo "<br>";
    echo "Session : ";
    print_r($_SESSION);
    
    if ( !isset($_SESSION[id] && !isset($_SESSION[login_time]) ){
    // 세션의 id와 login_time이 존재하지 않으면 아래 HTML코드를 화면에 출력
?>
        <!doctype html>
        <html>
        <head></head>
 
        <body>
            <form method=POST action=login.php>
                ID : <input type="text" name="id" /><br/>
                PASSWORD :<input type="password" name="pw"/><br/>
                <input type="submit" value="Login"/>
            </form>
        </body>
        </html>
 
<?php
 
        }else{                                                      
        // 세션값들이 존재한다면 다음 문장 출력
 
            echo "already login <br>";
            echo "<a href=logout.php> Logout </a>";
        }
    }
?>

/var/www/html/logout.php ] - http://192.168.6.123/logout.php 웹 페이지 소스코드

1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
    session_start();
    session_destroy();
 
    setcookie( session_name(), ''time()-9999999'');
 
 
?>
 
<meta http-equiv="refresh" content="0;url=http://192.168.6.123/login.php"/>
 
cs


[ 웹 페이지 출력화면 ]



아이디와 패스워드 입력하면 위의 화면처럼 쿠키와 세션에 사용자 정보가 저장되어진다

아이디는 user1 비밀번호는 pass로 로그인했던 정보가 세션에 저장되어집니다


* 세션을 사용한 사용자 인증

- 쿠키의 단점을 보완

- 사용자 정보를 클라이언트가 아닌 서버에 저장한다

- 서버는 쿠키를 통해서 클라이언트에게 전달 ( document.cookie에 세션아이디가 저장된다 )

- 웹 브라우저에는 세션아이디만 저장됨 - document.cookie = 세션아이디

- 세션 아이디를 통해서 서버에 있는 세션정보를 얻어오는거지

- 나머지 사용자 정보는 서버에 저장되서 안전하다 - 서버의 /var/lib/php/session/[세션아이디] 로써 저장된다


[ 서버 세션 저장소 ] - 가상머신 서버 192.168.6.123 


세션아이디를 파일명으로 하고 해당 사용자 정보가 저장되어져 있다



" http://192.168.6.123/logout.php 에서 로그아웃 버튼 Click => 세션내의 사용자 정보는 모두 삭제된다 "


[ 로그아웃 한 결과 ]


쿠키에는 세션 아이디가 그대로 저장되어있지만, 세션안의 사용자 정보들은 모두 삭제된다


[ 서버 세션 파일 확인 ] - 가상머신 서버 192.168.6.123


서버에서 세션파일 정보를 확인해보면 아무런 정보도 들어있지 않음을 확인 할 수 있습니다


[ 세션 파일 삭제하기 ]


쿠키에 존재하는 값을 ' ' 으로 초기화 시켜주기만 하면 됩니다



쿠키에 저장되어 있던 세션 아이디 또한 사라졌습니다 ! 

기존의 세션파일은 삭제했지만 logout.php에서 session_start()함수에 의해 새로운 세션이 새롭게 생성되었다

( 아무런 정보도 들어있지 않는 새로운 세션파일이 하나 생성된다 )