Backouts_ Logbook

모의해킹 공부 정리 9일차 (로그아웃) 본문

웹 해킹/웹 개발

모의해킹 공부 정리 9일차 (로그아웃)

Backouts 2024. 10. 25. 20:23

로그아웃 기능

 

로그인 기능을 만들었지만 로그아웃 기능까지 만들려고 하니 수정이 필요해졌습니다.
일단 mysql에 로그인 온/오프를 기록하기 위한 Boolean 타입 컬럼(열)을 하나 만들었습니다.
그리고 로그인 시 1을 기록하고 로그아웃시 0을 기록하도록 변경하였습니다.

 

login 컬럼 추가

alter table users add login boolean not null;

alter table로 테이블의 열을 추가, 제거 이름변경 등 속성을 변경할 수 있습니다.

alter table [테이블명] add [컬럼명] [타입 및 속성];으로 컬럼을 추가해 줍니다.


 

login_proc2.php 변경

 

수정전

<?php
    include("mysql.php");

    $id = $_POST["id"];
    $pass = $_POST["passwd"];
    $url = '/login_successful.php';
    $sql = "select nickname from users where id='$id' and password='$pass';";

    $sql_result = runSQL($sql);

    if ($row = mysqli_fetch_array($sql_result)) {
        $nick = $row['nickname'];

        echo "<form id='redirection-form' action='$url' method='post'>";
        echo "<input type='hidden' name='nickname' value='$nick'>";
        echo "</form>";
        echo "<script>document.getElementById('redirection-form').submit()</script>";
        exit;
    }    
    header('Location: login2.php?result=failed');
?>

 

수정 후

<?php
    include("mysql.php");

    $id = $_POST["id"];
    $pass = $_POST["passwd"];
    $url = '/login_successful.php';
    $sql = "select nickname from users where id='$id' and password='$pass';";

    $sql_result = runSQL($sql);

    // $result = false;

    if ($row = mysqli_fetch_array($sql_result)) {
        $nick = $row['nickname'];
        $update_sql = "update users set login=1 where nickname='$nick';";
        runSQL($update_sql);

        echo "<form id='redirection-form' action='$url' method='post'>";
        echo "<input type='hidden' name='nickname' value='$nick'>";
        echo "</form>";
        echo "<script>document.getElementById('redirection-form').submit()</script>";
        exit;
    }
    
    header('Location: login2.php?result=failed');
?>

 

if ($row = mysqli_fetch_array($sql_result)) {

유저의 아이디와 패스워드가 db에 존재할 때 if문을 실행합니다.

 

        $update_sql = "update users set login=1 where nickname='$nick';";
        runSQL($update_sql);

 

$update_sql에 update문을 이용해 닉네임이 일치하는 행의 login 열을 1로 설정합니다.

update문은 테이블의 값을 변경하는 구문입니다.

구조는 UPDATE [테이블명] SET [COLUMN]=[값]  where [조건문]; 으로 이루어져 있습니다.


 

로그아웃 버튼 추가

 

login_successful.php

<?php 
    $nickname = $_POST['nickname'];
?>

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Almond</title>
    <link rel="stylesheet" href="/css/login_successful.css">
    <script src="./script/logout.js" defer></script>
</head>
<body>
    <container class="profile-container">
        <div class="profile">
            <img src="/imgs/almond-profile.jpg" class="profile_img">
            <div class="profile_info">
                <h2 class="profile_name"><?php echo $nickname; ?></h2>
                <p class="profile_subs">구독자 <strong>0명</strong></p>
            </div>
        </div>
        
        <div class="profile_link">
            <a href="#" class="link_tab"><p>글쓰기</p></a>
            <a href="#" class="link_tab"><p>마이페이지</p></a>
            <?php
                printf('<button class="link_tab logout-btn" onclick=\'logout("%s")\'>로그아웃</button>', $nickname);
            ?>
        </div>
    </container>
</body>
</html>

 

<script src="./script/logout.js" defer></script>

<?php
    printf('<button class="link_tab logout-btn" onclick=\'logout("%s")\'>로그아웃</button>', $nickname);
?>

달라진 부분은 이 정도입니다.

 

printf('<button class="link_tab logout-btn" onclick=\'logout("%s")\'>로그아웃</button>', $nickname);

이 부분에서 유의할 점은 \' 부분입니다.

따옴표 ' 사이에 따옴표를 넣을 때는 \을 이용해 이스케이프 문자를 활용하면 편합니다.

 


로그아웃 기능 추가

 

logout.js

function logout(nickname) {
  console.log(nickname);

  fetch('/logout.php', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json; charset=utf-8',
    },
    body: JSON.stringify({
      nickname: nickname,
    }),
  })
    .then((res) => res.json())
    .then((res) => {
      if (res.result) {
        window.location.href = res.url;
      }
    });
}

logout 함수를 담은 파일입니다.

fetch를 이용해 logout.php에 로그아웃을 할 계정의 닉네임을 전송합니다.

그리고 응답에 결과값이 true이면 로그인 페이지로 돌아갑니다.

 

logout.php

<?php
    include("mysql.php");
    $result = true;
    $nick = json_decode(file_get_contents("php://input"), true)['nickname'];
    // echo "$nick";
    $sql = "update users set login=0 where nickname='$nick';";

    $sql_result = runSQL($sql);

    header("Content-Type: application/json");
    echo json_encode(["url" => "/login2.php", "result" => $result]);
?>

 

$nick = json_decode(file_get_contents("php://input"), true)['nickname'];

$nick 변수에 POST로 들어온 닉네임값을 json을 디코딩해서 넣습니다.

 

$sql = "update users set login=0 where nickname='$nick';";
$sql_result = runSQL($sql);

$sql에 일치하는 닉네임의 login열을 0으로 설정하는 sql쿼리문을 넣습니다.

runSQL함수로 쿼리를 실행합니다

 

header("Content-Type: application/json");
echo json_encode(["url" => "/login2.php", "result" => $result]);

header에 컨텐츠 타입을 json으로 설정해줍니다.

echo를 이용해서 logout.js에 url과 result를 담은 연관배열을 json으로 패키징해서 보냅니다.


동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.

 

아직 부족한 점이 많긴합니다
로그인 로그아웃을 기록하긴 하지만 유저를 구분하지 못해서
로그인을 유지하지를 못하네요
아마도 쿠키와 세션을 배울때쯤 적용해볼것 같습니다.