본문 바로가기

웹 개발

[2주차] 로그인 구현 #2 - 세션을 이용한 PHP 로그인 기능 구현

https://seahippocampus.tistory.com/13

 

[2주차] 로그인 기능 구현 / 메인 페이지 /로그아웃 기능 구현

로그인 기능을 구현해놓은 결과만 있는 것이 아니라 여러 시행착오와 과정들에서 보완점과 느낀점이 함께 적혀있습니다 읽을 때 고려해주세요! ------------------------------------------------------- 로그

seahippocampus.tistory.com

저번에는 조건문같은 기본적인 코드의 구조를 통해 GET 방식으로 페이지를 옮겨가면서

로그인을 만들었지만, 쿠키나 세션 등을 전혀 이용하지 않았다

 

그래서 이번에 세션을 이용한 PHP 로그인 기능을 구현해 보려고 한다

세션에 관한 정보는

https://teserre.tistory.com/8

이 블로그를 참조했다

 

소스코드는

https://answerofgod.tistory.com/468

위 블로그를 참조했다

 

 

세션을 이용하려면 session 변수를 이용한다

간단히 session에 대해서 알아보자면

 

세션 시작

<?php
session_start();
?>

이 코드를 넣어줘야 php에서 세션을 시작할 수 있다

사용자 정보가 웹 서버에 없을 경우에는 새로운 세션을 생성하고, 이미 세션이 있다면 그 존재하는 세션을 이용한다.

php에서 세션을 생성하면 세션의 이름이 PHPSESSID로 저장된다.

 

<?php
if(!session_id()) {
// id가 없을 경우 세션 시작
    session_start();
}
?>

 

세션 변수

//세션 변수 등록
$_SESSION['id'] = 'bokyu';
$_SESSION['password'] = '1111';

$_SESSION['변수이름'] = '문자열' ; 이런 형태로 사용하면 세션 변수를 등록할 수 있다.

id 라는 세션 변수에 bokyu라는 값을 저장하는 의미이다.

 

변수를 해제하고 싶다면

unset($_SESSION['id']);

이 코드를 입력하면 해제가 가능하다.

또는

session_unset()

함수를 이용하면 모든 변수의 등록이 해제된다.

 

세션 id를 새로 발급받고 싶다면

echo session_id();

session_regenerate_id();

regenerate함수를 이용하면 된다.

 

세션 종료

session_destroy();

위 함수를 이용하면 세션 파일을 삭제시킬 수 있다

 

----------------------------------------------------------------------------------------------------------------------------------------------

개발

총 4개의 페이지로 구분됩니다.

  • login.php
  • login_proc.php
  • main.php
  • logout.php

login.php

<!DOCTYPE html>
<html>
<?php
    session_start();
    if(isset($_SESSION['is_login'])){
        header('Location: ./main.php');
    }
?>
<head>
    <meta charset="utf-8"/></head> 
    <title>Normaltic login hw</title>
</head>
<body>
    <h1>2주차 로그인 기능 구현 과제</h1>
        <p>아이디 비밀변호 입력하세요</p>
    <form action='login_proc.php' method='POST'>
        <p>ID : 
        <input type='text'name='id' placeholder='여기에 아이디를 입력하세요' /></p>
        <p>PW : 
        <input type='password' name='pw' placeholder-'여기에 비밀번호를 입력하세요'/></p>
        <input type='submit' value='로그인'/>
    </form>
    <?php
    if(isset($_SESSION['msg'])){
        echo $_SESSION['msg'];
        unset($_SESSION['msg']);
    }
   ?>
</body>
</html>

전의 login.php와 다른 점은 session을 적용해서 맨 윗 코드에 session_start()가 있다는 점이고

초전역변수 $_SESSION['is login'] 으로 로그인 여부를 웹 페이지에서 관찰하고 있다

 

form 태그로 입력받은 id 와 password를 POST 방식으로 서버에 전달하고 있다 

 

그리고 header라는 함수가 보이는데, header ('Location: ~~~~'); 로 사용하면 페이지를 그 쪽으로 밀 수있다.

javascript에서의 window.location.replace 와 비슷한 느낌

 

login_proc.php

<?php
session_start();
if(($_POST['id']!=null)&&($_POST['pw']!=null)){
    if(($_POST['id']=='answer')&&($_POST['pw']=='1234')){
        $_SESSION['is_login']=true;
        $_SESSION['id']=$_POST['id'];
        header('Location: ./main.php');
    }else{
        $_SESSION['msg']='wrong id or pw';
        header('Location: ./login.php');
    }
}else{
    $_SESSION['msg']='null id or pw';
    header('Location: ./login.php');
}
?>

로그인을 테스트하는 중간 지점인 login_proc.php 페이지이다. 강사님이 알려준 CTF를 할 때도

히스토리에만 나오고 정말 짧게 스쳐지나가는 proc 페이지가 나온 적 있는데, 확실히 웹 개발을 해보니

왜 필요한지를 알겠다.

로그인 페이지 자체에서 값을 받아와서 다 판단하려면 고려해야할 게 한 두 개가 아님

그냥 로그인 검사 proc 페이지 만드는 게 속편하더라

 

코드를 보면

앞서 나온 header를 굉장히 잘 활용하고 있다

if 조건문을 두개를 걸어 두 조건을 만족할 때만 메인페이지로 이동하고 틀렸을 경우 로그인 페이지로,

아예 입력하지 않았을 경우도 로그인 페이지로 이동하게 된다

로그인 페이지에 나왔던 $_SESSION['is login']이 True가 되면서 로그인이 유지될 것이다

이걸 로그아웃으로 다시 false로 끄지 않는 한 계속 true로 유지될 것이고,

그로 인해 이용자들은 웹 페이지를 탐방할 때마다 일일히 로그인을 인증받아야할 이유가 없어진 것이다

 

main.php

<!DOCTYPE html>
<?php
session_start();
?>
<html lang="en">
<head>
	<title>Normaltic login hw</title>
</head>
<body>
<h1>2주차 로그인 기능 구현 과제</h1>
<br><br>
<?php
if(!isset($_SESSION['is_login'])){
    $_SESSION['msg']='로그인을 해야 합니다';
    header('Location : ./login.php');
}else{
    if(isset($_SESSION['id'])){
        echo '현재'.$_SESSION['id'].'님으로 로그인되어 있습니다';
    }else{
        echo 'Welcome to blog management';
    }
    echo '<form action="logout.php" >
    <input type="submit" value="로그아웃"/>
    </form>'; 
}
?>
<script>
var today = new Date();
document.write(today)
</script>
</body>
</html>

이제 로그인을 성공시켰을 때 나오는 main.php 메인 페이지이다.

 

마지막 echo에서 따옴표 안에 form태그를 넣어서 logout.php로 값을 보낸다.

 

페이지를 들어간 실시간 날짜와 시간이 표시되고 현재 어떤 아이디로 로그인되어있는지

세션아이디를 받아서 표시해준다.

 

 

 

logout.php

<?php
session_start();
session_destroy();
header('Location: ./login.php');
?>

 

 

페이지를 한번 보자

제일 처음 나오는 로그인 페이지이다

post 방식으로 id와 pw에 입력한 값이 login_proc.php 파일로 넘어간다

아직 DB 까진 연결하지 않았고 그냥 지정된 조건문을 이용했다

해당하는 ID와 PW를 입력하면 메인 페이지로 넘어간다

 

 

메인 페이지는 어떤 아이디로 로그인되어있는지를 보여주고 아직 구현되지 않은 글 작성란과

로그아웃 버튼 그리고 현재 실시간 시간을 보여준다.

 

SESSION을 이용한 로그인 방식의 장점은 뒤로가기 버튼을 눌러도 $_SESSION['is login']이 true이기 때문에

login페이지로 넘어가지 않는다는 것이다. 이것은 저번에 만들었던 방식으로는 구현해낼 수 없는 현상이다.

 

로그아웃을 누르면 바로 session_destroy로 세션id가 파괴되고 header로 login.php로 밀리면서

순식간에 로그아웃이 되는 것을 볼 수 있다