단방향 암호화 & Member/Guests UI

이태현·2025년 7월 18일

Web 개발

목록 보기
15/53
post-thumbnail

단방향 암호화

출 처 https://hyunseo-fullstackdiary.tistory.com/127

  • 비밀번호를 암호화하는데 한쪽 방향으로만 암호화가 가능하다, 즉 반대로 암호를 풀 수 없다는 뜻입니다. 덕분에 비밀번호를 숨기는 데 있어서 아주 좋습니다. 또한 비밀번호가 유출되어도 이미 암호화되었기 때문에 의미가 없습니다.
    ex )

    ※ 위에 사진과 같이 비밀번호를 저장하면 절대 안 됩니다.
// 단방향 암호화
    $password_hash = password_hash($marr["password"], PASSWORD_DEFAULT);
  • 사용법은 간단합니다.
    php에서 제공하는 내장함수를 사용합니다.
    첫 번째 파라미터에는 사용자의 비밀번호가 들어가고,
    두 번째 파라미터에는 암호화할 알고리즘을 선택합니다. (보통 기본을 선택합니다)

DB - Hash 회원등록

public function input($marr)
  {
    // 단방향 암호화
    $password_hash = password_hash($marr["password"], PASSWORD_DEFAULT);

    $sql = "INSERT INTO member(id, name, password, email, zip_code, addr1, addr2,photo, create_at, ip) VALUES(:id, :name, :password, :email, :zipcode, :addr1, :addr2, :photo, NOW(), :ip)";
    $stmt = $this->conn->prepare($sql);
    
    $stmt->bindParam(":id", $marr["id"]);
    $stmt->bindParam(":name", $marr["name"]);
    $stmt->bindParam(":password", $password_hash);
    $stmt->bindParam(":email", $marr["email"]);
    $stmt->bindParam(":zipcode", $marr["zipcode"]);
    $stmt->bindParam(":addr1", $marr["addr1"]);
    $stmt->bindParam(":addr2", $marr["addr2"]);
    $stmt->bindParam(":photo", $marr["photo"]);
    $stmt->bindParam(":ip", $_SERVER["REMOTE_ADDR"]);
    $stmt->execute();
  }
  • 암호화한 비밀번호를 $password_hash에 담아서 준비된 쿼리에 바인딩 합니다.

DB - Hash 로그인

// 로그인
  public function login($id, $pw)
  {
    $sql = "SELECT password FROM member WHERE id=:id";
    $stmt = $this->conn->prepare($sql);
    $stmt->bindParam(":id", $id);
    $stmt->execute();

    if ($stmt->rowCount()) {
      $row = $stmt->fetch();

      if (password_verify($pw, $row["password"])) {
        $sql = "UPDATE member SET login_dt=NOW() WHERE id=:id";
        $stmt = $this->conn->prepare($sql);
        $stmt->bindParam(":id", $id);
        $stmt->execute();

        return true;
      } else {
        return false;
      }
    } else {
      return false;
    }
  }

출 처 https://wikidocs.net/209361

  • 로그인을 하기 위해서 ID, PW를 가지고 판단을 했었는데, 암호화를 해버리면 더 이상 PW를 가지고 해당 값이 DB에 저장된 값이랑 같은지를 비교할 수 없습니다. 따라서 이 문제를 해결하기 위해서는 password_verify()를 사용하여야 합니다.
password_verify($pw, $row["password"])

해당 함수는 사용자의 PW와 DB에 저장된 hash 값을 비교하여 참, 거짓으로 결과를 반환합니다.

위 사진과 같이 DB에 저장된 PW는 더 이상 한눈에 판단하기 어려운 값이 저장된 걸 볼 수 있습니다.

Member/Guests UI

  • 이미 회원에 등록된 사용자가 게스트와 같은 화면일 수는 없겠죠? 그래서 현재 접속하고 있는 User가 누구인지에 따라서 보이는 페이지가 달라야 합니다.

ex ) Guests UI


게스트들은 아직 회원가입이 되어있는 상태가 아니기 때문에 이와 같은 화면을 보여주도록 하였습니다.

ex ) Member UI


회원 등록된 User들은 더 이상 Header 부분에 로그인, 회원가입이 필요 없기 때문에 회원의 정보를 수정하거나, 로그아웃이 보이도록 하였습니다.

로그인 처리 login_process

<?php

$id = (isset($_POST["id"]) && $_POST["id"] != "" ? $_POST["id"] : "");
$pw = (isset($_POST["pw"]) && $_POST["pw"] != "" ? $_POST["pw"] : "");

if ($id == "") {
  die(json_encode(["result" => "empty_id"]));
}
if ($pw == "") {
  die(json_encode(["result" => "empty_pw"]));
}

include "../inc/dbconfig.php";
include "../inc/member.php";

$mem = new Member($db);

if ($mem->login($id, $pw)) {
  $arr = ["result" => "Login_success"];

  session_start();
  $_SESSION["id"] = $id;
} else {
  $arr = ["result" => "Login_fail"];
}

die(json_encode($arr));
  • post 방식으로 데이터를 ID, PW에 담아줍니다.
  • 로그인에 성공했을 시 세션을 만들어서 Member/Guests를 구분해 줍니다.

Header

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-LN+7fdVzj6u52u30Kp6M/trliBMCMKTyK833zpbD+pXdCLuTusPj697FH4R/5mcr" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js" integrity="sha384-ndDqU0Gzau9qJ1lfW4pNLlhNTkCfHzAVBReH9diLvGRem5+R9g2FzA8ZGN954O5Q" crossorigin="anonymous"></script>
  <link rel="stylesheet" href="css/stipulation.css">
  <?php
  if (isset($js_array)) {
    foreach ($js_array as $var) {
      echo "<script src='" . $var . "?v=" . date("YmdHis") . "'></script>";
    }
  } ?>
  <title><?= (isset($g_title) && $g_title != "" ? $g_title : "해커들의 놀이터"); ?></title>
</head>

<body>
  <div class="container">
    <header class="d-flex flex-wrap justify-content-center py-3 mb-4 border-bottom">
      <a href="stipulation.php" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto link-body-emphasis text-decoration-none">
        <img src="images/logo.svg" alt="" class="me-2">
        <span class="fs-4">해커들의 놀이터</span>
      </a>
      <ul class="nav nav-pills">
        <?php if (isset($ss_id) && $ss_id != "") {
          // 로그인 
        ?>
          <li class="nav-item">
            <a href="index.php" class="nav-link <?= $menu_code == "home" ? "active" : ""; ?>" aria-current="page">Home</a>
          </li>
          <li class="nav-item">
            <a href="company.php" class="nav-link <?= $menu_code == "company" ? "active" : ""; ?>">소개</a>
          </li>
          <li class="nav-item">
            <a href="mypage.php" class="nav-link <?= $menu_code == "member" ? "active" : ""; ?>">회원정보</a>
          </li>
          <li class="nav-item">
            <a href="board.php" class="nav-link <?= $menu_code == "board" ? "active" : ""; ?>">게시판</a>
          </li>
          <li class="nav-item">
            <a href="pg/logout.php" class="nav-link <?= $menu_code == "login" ? "active" : ""; ?>">로그아웃</a>
          </li>
        <?php
        } else {
          // 비 로그인
        ?>
          <li class="nav-item">
            <a href="index.php" class="nav-link <?= $menu_code == "home" ? "active" : ""; ?>" aria-current="page">Home</a>
          </li>
          <li class="nav-item">
            <a href="company.php" class="nav-link <?= $menu_code == "company" ? "active" : ""; ?>">소개</a>
          </li>
          <li class="nav-item">
            <a href="stipulation.php" class="nav-link <?= $menu_code == "member" ? "active" : ""; ?>">회원가입</a>
          </li>
          <li class="nav-item">
            <a href="board.php" class="nav-link <?= $menu_code == "board" ? "active" : ""; ?>">게시판</a>
          </li>
          <li class="nav-item">
            <a href="login.php" class="nav-link <?= $menu_code == "login" ? "active" : ""; ?>">로그인</a>
          </li>
        <?php
        }
        ?>
      </ul>
    </header>

코드가 살짝 길어서 보기 힘들 수 있지만 Body 태그에 ul 태그 안에만 보시면 됩니다.

  • 간단히 설명해 보면
if (isset($ss_id) && $ss_id != "")

조건문을 통해서 해당 sessionID가 있을 경우, 즉 로그인이 되어있을 때 참, 거짓으로 조건을 나누었습니다.

마무리

다음 시간에는 회원 정보를 수정하는 부분을 해보겠습니다.

긴 글 봐주셔서 감사합니다.

profile
이해하고 분석하고 지배한다

0개의 댓글