2017. 8. 18. 19:53ㆍWebHacking/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>"; } } ?> |
[ /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) 쿠키의 유효기간동안에는 재인증없이 사용이 가능
=> 쿠키값이 타인에게 노출되면 악용이 가능하다
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/[세션아이디] 로써 저장된다
세션아이디를 파일명으로 하고 해당 사용자 정보가 저장되어져 있다
" http://192.168.6.123/logout.php 에서 로그아웃 버튼 Click => 세션내의 사용자 정보는 모두 삭제된다 "
[ 로그아웃 한 결과 ]
쿠키에는 세션 아이디가 그대로 저장되어있지만, 세션안의 사용자 정보들은 모두 삭제된다
[ 서버 세션 파일 확인 ] - 가상머신 서버 192.168.6.123
서버에서 세션파일 정보를 확인해보면 아무런 정보도 들어있지 않음을 확인 할 수 있습니다
[ 세션 파일 삭제하기 ]
쿠키에 존재하는 값을 ' ' 으로 초기화 시켜주기만 하면 됩니다
쿠키에 저장되어 있던 세션 아이디 또한 사라졌습니다 !
기존의 세션파일은 삭제했지만 logout.php에서 session_start()함수에 의해 새로운 세션이 새롭게 생성되었다
( 아무런 정보도 들어있지 않는 새로운 세션파일이 하나 생성된다 )
'WebHacking > Web' 카테고리의 다른 글
PHP와 MySQL을 활용한 게시판 만들기[1] - 회원가입 (1) | 2017.08.22 |
---|---|
MySQL설치 및 DB생성 / Table 생성 (0) | 2017.08.21 |
PHP GET / POST 개념 및 사용방법 (1) | 2017.08.17 |
PHP배열(array생성자) 및 반복문(foreach) (0) | 2017.08.02 |
가상머신에 PHP설치 / PHP출력문 / 변수 (0) | 2017.08.02 |