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

// 단방향 암호화
$password_hash = password_hash($marr["password"], PASSWORD_DEFAULT);
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();
}
// 로그인
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
password_verify($pw, $row["password"])
해당 함수는 사용자의 PW와 DB에 저장된 hash 값을 비교하여 참, 거짓으로 결과를 반환합니다.

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

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

회원 등록된 User들은 더 이상 Header 부분에 로그인, 회원가입이 필요 없기 때문에 회원의 정보를 수정하거나, 로그아웃이 보이도록 하였습니다.
<?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));
<!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가 있을 경우, 즉 로그인이 되어있을 때 참, 거짓으로 조건을 나누었습니다.
다음 시간에는 회원 정보를 수정하는 부분을 해보겠습니다.
긴 글 봐주셔서 감사합니다.