지난시간에 어느 페이지에서든 변수를 꺼내 사용할 수 있는 쿠키과 내용을 기록하고 꺼내사용할 수 있는 파일 이용하는 방법을 배웠습니다.

전체를 진행하기 전에 우선 최초에 접근하는 페이지를 먼저 만들어 보도록 하겠습니다.

<?
// 처음 및 로그인 페이지

// 쿠키에 저장된 아이디 값을 불러오기
$user_id = $_COOKIE['user_id'];

// 쿠키에 저장된 이름 값을 불러오기
$user_name = $_COOKIE['user_name'];

// 쿠키에 저장된 아이디 값이 있으면 로그인 한 상태이므로
if($user_id){
?>
<table border="1">
    <tr>
        <td align="center"><?=$user_name?>님 어서오세요.</td>
    </tr>
    <tr>
        <td align="center">아이디 : <?=$user_id?></td>
    </tr>
    <tr>
        <td align="center"><a href="21_5.php">로그아웃</a></td>
    </tr>
</table>
<?
// 쿠키에 저장된 아이디 값이 없으면 로그인 안 한 상태이므로
}else{
?>
<form name="flogin" method="post" action="21_4.php">
<table border="1">
    <tr>
        <td align="center">찾아주셔서 감사합니다.</td>
    </tr>
    <tr>
        <td align="center">아이디 : <input type="text" name="user_id"></td>
    </tr>
    <tr>
        <td align="center">비밀번호 : <input type="password" name="user_pw"></td>
    </tr>
    <tr>
        <td align="center"><input type="submit" value="로그인"></td>
    </tr>
    <tr>
        <td align="center"><a href="21_2.php">회원가입</a></td>
    </tr>
</table>
</form>
<?
}
?>
[21_1.php 소스]

로그인 하지 않았을 경우 21_1.php 출력


로그인 했을 경우 21_1.php 출력


쿠키에 user_name 이란 변수에 값이 있는지를 조사하여 로그인 한 경우와 로그인 하지 않은 경우를 구분한다.

이제 회원가입을 하는 페이지를 만들어 보자.
<?
// 회원가입 페이지

// 쿠키에 저장된 아이디 값을 불러오기
$user_id = $_COOKIE['user_id'];

// 쿠키에 저장된 아이디 값이 있으면 로그인 한 상태이므로
if($user_id){
?>
이미 로그인 하셨습니다.<br/>
<a href="./21_1.php">처음으로</a>
<?
// 쿠키에 저장된 아이디 값이 없으면 로그인 안 한 상태이므로
}else{
?>
<form name="frgistration" method="post" action="21_3.php">
<table border="1">
    <tr>
        <td align="center">회원가입</td>
    </tr>
    <tr>
        <td align="center">아이디 : <input type="text" name="user_id"></td>
    </tr>
    <tr>
        <td align="center">비밀번호 : <input type="password" name="user_pw"></td>
    </tr>
    <tr>
        <td align="center">이름 : <input type="text" name="user_name"></td>
    </tr>
    <tr>
        <td align="center"><input type="submit" value="가입하기"></td>
    </tr>
    <tr>
        <td align="center"><a href="./21_1.php">처음으로</a></td>
    </tr>
</table>
</form>
<?
}
?>
[21_2.php 소스]

로그인 한 상태로 접근한 경우 21_2.php 출력


로그인 하지 않은 상태로 접근한 경우 21_2.php 출력


로그인 한 경우는 회원가입을 할 수 없으므로 로그인 한 경우와 로그인 하지 않은 경우로 나누어 처리한다.
로그인 여부는 쿠키에 저장되어 있는 user_name 값의 여부로 따진다.

회원가입 처리 페이지
<?
// 회원정보 저장 페이지

// 쿠키에 저장된 아이디 값을 불러오기
$user_id = $_COOKIE['user_id'];

// 쿠키에 저장된 아이디 값이 있으면 로그인 한 상태이므로
if($user_id){
?>
이미 로그인 하셨습니다.<br/>
<a href="./21_1.php">처음으로</a>
<?
// 쿠키에 저장된 아이디 값이 없으면 로그인 안 한 상태이므로
}else{
    // 아이디와 비밀번호 값이 둘다 있으면
    if($_POST['user_id'] && $_POST['user_pw']){

        $savefile = "./data/21_1.txt";

        // 가입여부 변수
        $is_registerd = false;

        // 파일이 존재하면
        if(file_exists($savefile)){
            // 파일을 읽기 전용으로 읽고
            $fp = fopen($savefile, "r");
            // 파일내용이 없을때까지 한줄씩 읽어 $data 에 내용 넣기
            while($data = fgets($fp, 1024)){
                // 구분자 | 로 잘라 배열로 저장
                $user_data = explode("|", $data);
               
                // 일치하는 아이디가 있으면 이미 가입한 사람
                if($_POST['user_id'] == $user_data[0]){
                    $is_registerd = true;
                }
            }
            fclose($fp);
        }
       
        // 가입한 사람이면
        if($is_registerd){
            ?>
            이미 가입 하셨습니다.<br/>
            <a href="./21_1.php">처음으로</a>
            <?
        // 가입하지 않은 사람이면 파일에 저장 후 가입메세지 출력
        }else{
            $fp = fopen($savefile, "a+");
            $data = $_POST['user_id']."|".$_POST['user_pw']."|".$_POST['user_name']."\n";
            fwrite($fp, $data);
            fclose($fp);
            ?>
            가입을 축하드립니다.<br/>
            <a href="./21_1.php">처음으로</a>
            <?
        }

    // 하나라도 없으면
    }else{
    ?>
    아이디나 패스워드를 입력하지 않으셨습니다.<br/>
    <a href="./21_2.php">회원가입</a><br/>
    <a href="./21_1.php">처음으로</a>
    <?
    }
}
?>
[21_3.php 소스]

로그인 한 상태로 접근한 경우 21_2.php 출력


아이디나 비밀번호를 입력하지 않은 채 회원가입 버튼을 누른 경우 21_3.php 출력


아이디가 이미 가입된 경우  21_3.php 출력


제대로 가입된 경우   21_3.php 출력


우선 로그인 여부를 따져 로그인 사람의 경우 로그인되었다는 메세지를 띄운다.

로그인 하지 않았을 경우 입력값이 제대로 들어왔는지, 가입되어 있는지 를 따져 해당 결과에 따라 메세지를 띄운다.


로그인 처리 페이지
<?
// 로그인 처리 페이지

// 쿠키에 저장된 아이디 값을 불러오기
$user_id = $_COOKIE['user_id'];

// 쿠키에 저장된 아이디 값이 있으면 로그인 한 상태이므로
if($user_id){
?>
이미 로그인 하셨습니다.<br/>
<a href="./21_1.php">처음으로</a>
<?
// 쿠키에 저장된 아이디 값이 없으면 로그인 안 한 상태이므로
}else{
    // 저장된 파일에서 아이디 검색하기

    $savefile = "./data/21_1.txt";

    // 파일이 존재하면
    if(file_exists($savefile)){

        // 가입여부 변수
        $is_registerd = false;       

        // 파일을 읽기 전용으로 읽고
        $fp = fopen($savefile, "r");
        // 파일내용이 없을때까지 한줄씩 읽어 $data 에 내용 넣기
        while($data = fgets($fp, 1024)){
            // 구분자 | 로 잘라 배열로 저장
            $user_data = explode("|", $data);
           
            // 아이디와 비밀번호가 일치하면
            if($_POST['user_id'] == $user_data[0] && $_POST['user_pw'] == $user_data[1]){
                $is_registerd = true;
                $user_id = $user_data[0];
                $user_name = $user_data[2];
            }
        }
        fclose($fp);

        // 로그인 정보가 일치할 경우
        if($is_registerd){
            // 쿠키에 5분간 저장
            setcookie("user_id", $user_id, time() + 60*5);
            setcookie("user_name", $user_name, time() + 60*5);
            ?>
            어서오세요. <?=$user_name?>님<br/>
            <a href="./21_1.php">처음으로</a>
            <?
        // 로그인 정보가 일치 하지 않을 경우
        }else{
            ?>
            로그인 정보가 정확하지 않습니다.<br/>
            <a href="./21_1.php">처음으로</a> <a href="./21_2.php">회원가입</a>
            <?
        }
   
    // 파일이 존재 하지 않으면 가입도 당연히 안되어 있으므로
    }else{
        ?>
        로그인 정보가 정확하지 않습니다.<br/>
        <a href="./21_1.php">처음으로</a> <a href="./21_2.php">회원가입</a>
        <?
    }

}
?>
[21_4.php 소스]

로그인 한 상태로 접근한 경우 21_4.php 출력


로그인 정보가 정확하지 않을 때의 21_4.php 출력


로그인 정보가 정확할 경우 21_4.php 출력


로그인 여부를 먼저 검사 후 로그인 한 경우 로그인했다는 메세지를 출력한다.

로그인 하지 않았을 경우에는 파일을 검사해 아이디와 비밀번호가 일치하는 정보가 있으면 아이디와 이름을 쿠키에 저장하고
메세지를 출력한다.

로그아웃 처리 페이지
<?
// 로그아웃 페이지

// 쿠키에 저장된 아이디 값을 불러오기
$user_id = $_COOKIE['user_id'];

// 쿠키에 저장된 아이디 값이 있으면 로그인 한 상태이므로
if($user_id){
    // 쿠키에서 값 삭제
    setcookie("user_id", "");
    setcookie("user_name", "");
?>
로그 아웃 되었습니다.<br/>
<a href="./21_1.php">처음으로</a>
<?
// 쿠키에 저장된 아이디 값이 없으면 로그인 안 한 상태이므로
}else{
?>
로그인한 상태가 아닙니다.<br/>
<a href="./21_2.php">회원가입</a><br/>
<a href="./21_1.php">처음으로</a>
<?
}
?>
[21_5.php 소스]

로그인 한 상태로 접근한 12_5.php 출력 결과


로그인 하지 않은 상태로 접근한 12_5.php 출력 결과


역시 로그인 여부를 따져 로그인 하지 않았을 경우에는 로그아웃이 필요 없으므로 로그인한 상태가 아니라고 출력하고

로그인 한 상태면 쿠키값을 비워 로그아웃된 상태로 만든 후 출력한다.


이처럼 파일과 쿠키를 가지고 로그인 여부나 회원 처리를 할수 있습니다.

그러나 파일이나 쿠키는 다른 사람이 읽을 수 있기 때문에 보안상 적절하지 않은 방법입니다.

여기서는 이러한 방식으로 관리가 가능하다는 것을 알려드리는 것입니다.

다음시간에는 PHP에서 많이 사용되는 기본적인 환경 변수들에 대해 알아보도록 하겠습니다.

그리고 이제부터는 설명을 많이 줄이고 주석으로 대체 하도록 하겠으니 질문이 있으시면 댓글로 남겨주시면 답변해 드리도록 할께요. ^^
저작자 표시 비영리 변경 금지
Posted by 슬픈기쁨

댓글을 달아주세요

  1. ㅎㅎ
    2009/11/20 15:19
    댓글 주소 수정/삭제 댓글
    감사합니다. 기회가 되신다면 세션쪽도 부탁드립니다.ㅎㅎ
    • 2009/11/21 20:59
      댓글 주소 수정/삭제
      관계형 게시판 만드는 부분이 지금 진행중인데요
      그 부분에서 로그인을 세션으로 합니다.
  2. 2009/11/29 18:13
    댓글 주소 수정/삭제 댓글
    다운을 받을수 있게 해주세요
    • 2009/11/29 20:42
      댓글 주소 수정/삭제
      소스는 직접 쳐보시면서 하시는게 연습에 도움이 됩니다.
      강좌는 강좌이지 소스를 제공해서 다른데 사용하시라는게 아닙니다.
  3. donydony
    2010/01/11 16:17
    댓글 주소 수정/삭제 댓글
    예제위주로 보니까 이해가 술술~
    좋은 글 감사합니다~~
  4. 호빵
    2010/02/22 12:33
    댓글 주소 수정/삭제 댓글
    근데 구분자 |는 어떻게 치는거죠?
    L도아닌거같은데
    • 지나가는 사람
      2010/11/05 13:47
      댓글 주소 수정/삭제
      Shift + \ (백스페이스 옆)
      이렇게 하시면 됩니다
  5. 2010/11/21 21:17
    댓글 주소 수정/삭제 댓글
    우와!!! 정말 감사합니다 ㅜㅜ
    이해 쏙쏙 되었네요.
    다른데는 이렇게 자세히 설명 해놓은데가 없었던듯 ㅎ./.
  6. ㅜㅜ
    2010/12/03 23:17
    댓글 주소 수정/삭제 댓글
    제가 학교 과제로 머리싸매다가..이 블로그를 찾아서 소스를 이용해봤는데요!
    아이디, 비밀번호, 이름 친 후 가입하기 누르면
    Warning: fopen(./data/21_1.txt): failed to open stream: No such file or directory in c:\apm_setup\htdocs\21_3.php on line 48

    Warning: fwrite(): supplied argument is not a valid stream resource in c:\apm_setup\htdocs\21_3.php on line 50

    Warning: fclose(): supplied argument is not a valid stream resource in c:\apm_setup\htdocs\21_3.php on line 51


    이렇게 오류메시지가 떠요 ㅜㅜ 21_3.php 의 48,50,51줄의 태그가 맞지 않다는건데
    어떻게 고쳐야 하는지좀 알려주세요~~ ㅜㅜㅜ 감사합니다!!
    • 2010/12/04 20:15
      댓글 주소 수정/삭제
      ./data/21_1.txt 파일이 없어서 생긴 문제입니다.
  7. ㅜㅜ
    2010/12/04 21:45
    댓글 주소 수정/삭제 댓글
    우와! 댓글 감사드립니다 ㅜㅜ
    그런데.. 그럼 이 문제를 해결하려면 어떻게 해야할까요!?ㅜㅜ
    data/21_1.txt 파일에는 무슨내용이 들어가야하는건지..ㅜㅜ
    • 2010/12/05 18:57
      댓글 주소 수정/삭제
      아무내용없이 읽고 쓰기 군한만 주면됩니다.
  8. 오인서
    2011/03/28 19:33
    댓글 주소 수정/삭제 댓글
    http://handsome.hosting.paran.com/php/data/21_1.txt
    여기 들어가보세요.
    개인정보 유출 가능성 100%
    • 2011/03/31 13:42
      댓글 주소 수정/삭제
      네 알아요.
      여기는 방법을 알려드리는거지 보안까지 하는건 아니잖아요.
      실제로적용한다면 웹으로는 접근이 불가능한 경로에 저장파일을 만들죠
      그외에도 여러 방법이 있는데요. 그 방법들 공개하면 제 보안 뚫리는건데 강좌에서 공개해야할까요?
      이건 그냥 강좌일뿐이지 실전 소스는 아닙니다. 실전에서 사용하실려면 스스로 공부하셔야 할게 많아요.
      강좌에 오타, 보안 이런거 안 따지셨으면 합니다.
  9. TEST
    2011/04/17 01:40
    댓글 주소 수정/삭제 댓글
    님아 이걸로 회원정보수정 이랑 회원탙퇴 기능 좀 예제올려주세요
  10. goldlife
    2011/08/01 21:09
    댓글 주소 수정/삭제 댓글
    파일,쿠키를 이용한 회원가입,로그인,로그아웃 기능 만들기를 예제대로 했는데 안되네요!!
    이유를 알고싶은데 부탁드릴게요!!
    쿠키 저장은 되는데 쿠키 호출이 안되거든요!...
    • 2011/08/24 11:58
      댓글 주소 수정/삭제
      print_r($_COOKIE);
      이처럼해서 쿠키에 값이 들어가 있는지 확인해 보세요
  11. think000
    2011/10/29 03:39
    댓글 주소 수정/삭제 댓글
    웹공부하면 할수록 할게 많아 집니다 1강부터 꾸준히 하는데 도움이 많이 됩니다 강좌 앞으로도 고마운마음으로 듣겠습니다 할수록 구문이 어려워지는데 요즘은 강좌를 진행안하시는거 같은데 답글이 달릴까요 ^^ 있는강좌도 열심히 해볼려고 합니다 궁굼한거 몇가지올립니다
    //<? <---이태그다음에는 구문이 끝나고 마감태그 ?> 가들어가는데 if구문이 나오고 다시 <? 의 사용이 몹시 헤깔립니다 php시작구문이 <? 테이블 중간에 나올때도 있고 몹시 헤깔립니다 머리가 나빠서인지 초보인저로서는 구문을 어디서 부터 시작하고 끝내는지도 헤깔립니다 그리고 post소문자 POST대문자사용
    대소문자는 어떻게 영향을 받는지도 궁금하구요 "쌍따음표와 '따음표의 차이도 잘모르겠습니다 어떨때
    "쌍따운표를 쓰는지 어떨때 '따운표를 쓰는지고 궁금합니다 머 이렇게 되면 다 궁금한게 되는군요
    답변해 주시면 고맙겠습니다 앞으로도 좋은강의 부탁드립니다..
    • 2011/10/31 15:13
      댓글 주소 수정/삭제
      1. <? 와 ?> 사이가 PHP인걸으로 보시면 됩니다.
      2. HTML에서는 대소문자를 안 가리고 PHP는 대소문자를 가립니다.
      3. echo '$a'; 하면 $a 가 그대로 출력되고 echo "$a"; 를 하면 $a 값이 출력이 됩니다.
  12. gkdl
    2012/02/15 20:11
    댓글 주소 수정/삭제 댓글
    Warning: Cannot modify header information - headers already sent by (output started at /DATA/dongtag/public_html/21_4.php:12) in /DATA/dongtag/public_html/21_4.php on line 55

    Warning: Cannot modify header information - headers already sent by (output started at /DATA/dongtag/public_html/21_4.php:12) in /DATA/dongtag/public_html/21_4.php on line 56
    어서오세요. 다웅 님
    처음으로
    ------------------------------------------
    로그인된 화면입니다.. 보시다 싶이..위에 영어가 나오구요 ㅠㅠ..로그아웃 도 없네요 머가 문제일까요...도저히 안되서 슬픈기쁨님꺼 동째로 소스 복사해서 봍여 넣기해도 똑같네요... 라인 55,56에 문제가 있단것같은데 머가먼지 ㅠㅠ...
  13. gkdl
    2012/02/15 21:34
    댓글 주소 수정/삭제 댓글
    아크로 에딧에다가 ..utf-8 쓰고 있습니다..도대체 머가 문젠지 모르겠네요..
  14. 2012/02/22 13:30
    댓글 주소 수정/삭제 댓글
    좋은정보 감사합니다.
    문제점-소스가 나와있으면 보안의 문제가 있어요.

<< PREV : [1] : ... [77] : [78] : [79] : [80] : [81] : [82] : [83] : [84] : [85] : ... [120] : NEXT >>

BLOG main image
PHPer를 위한 Tip , 휴식, 그리고........ by 슬픈기쁨

카테고리

분류 전체보기 (120)
PHP Tip (9)
PHP 강좌 (58)
Project 이야기 (5)
My Story (15)
꼬리 & 달이 이야기 (19)
의뢰하기 (1)
흥얼흥얼 (12)
Total : 160,044
Today : 26 Yesterday : 227