<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>Login Page</title>
<style>
body {
display: flex; /* 내부 요소를 정렬할 수 있게 함(기본 정렬 방식 대신 유연한 배치가 가능해짐) */
justify-content: center; /* 가로 방향 가운데 정렬*/
align-items: center; /* 세로 방향 가운데 정렬*/
height: 100vh; /* 화면 전체 높이
100vh는 화면 높이의 100%를 의미함 → 페이지 전체를 꽉 채워서 가운데 배치 가능 */
margin: 0; /*기본 브라우저 여백을 없애서 딱 맞게 배치*/
background-color: #f0f2f5;
}
.container {
text-align: center;
padding: 40px; /*박스 안쪽 여백을 40픽셀로 설정해서 넉넉한 공간 확보*/
border-radius: 12px; /* 박스 모서리를 둥글게*/
}
img {
width: 500px; /*이미지 가로 너비를 500픽셀로 고정한다*/
border-radius: 12px; /* 이미지 모서리를 둥글게*/
margin-bottom: 20px; /* 이미지 아래쪽 공간에 20px 추가해서 폼 사이의 여백 추가*/
}
</style>
</head>
<body>
<div class="container">
<!-- src 이미지를 가져오는데 만약 못불러올 경우 alt 내용을 출력하고 사진의 크기는 500으로 가져와라 -->
<img src="search.pstatic.jpeg" alt="Login Banner" width="500" />
<form method="POST" action="login_prcc.php">
<!-- 서버에서 name 또는 value 이름으로 값을 받을 수 있음, placeholder는 입력창에 흐리게 표시되는 글자 역할-->
<input type="text" name="id" placeholder="User ID" />
<input type="password" name="password" placeholder="User Password" />
<input type="submit" value="Login" />
<input type="submit" name="login_type" value="식별/인증 동시" style="padding: 20px;"/>
<input type="submit" name="login_type" value="식별/인증 분리" style="padding: 20px;"/>
<input type="submit" name="login_type" value="식별/인증 동시 + 해시" style="padding: 20px;"/>
<input type="submit" name="login_type" value="식별/인증 분리 + 해시" style="padding: 20px;"/>
</form>
<form method="POST" action="register.php" style="padding-top: 20px;">
<input type="submit" value="회원가입" />
</form>
</div>
</body>
</html>
~
~
login_prcc.php
$_SERVER["REQUEST_METHOD"]
$_SERVER는 PHP에서 제공하는 슈퍼 글로벌 변수 중 하나예요.
→ 이건 서버와 클라이언트(브라우저) 사이에 오가는 요청 정보, 환경 정보, 헤더 정보 등을 담고 있는 연관 배열이에요.
<?php
session_start();
// DB 연결
$conn = new mysqli("localhost:3306", "choyongyeop", "1234", "test");
if ($conn->connect_error) {
die("DB 연결 실패: " . $conn->connect_error);
}
// POST 방식으로 전송된 요청일 때만 실행됨
if ($_SERVER["REQUEST_METHOD"] === "POST" && isset($_POST['login_type'])) {
$type = $_POST["login_type"];
switch ($type) {
case "식별/인증 동시":
if(isset($_POST['id']) && isset($_POST['password'])) {
$id = $_POST['id'];
$pw = $_POST['password'];
$sql = "SELECT * from users where id = '$id' AND password = '$pw' ";
$result = $conn->query($sql);
if ($result && $result->num_rows>0) {
$_SESSION['id'] = $id;
header("Location: login_succ.php");
exit;
}
header("Location: login_fail.php");
exit;
}
break;
case "식별/인증 분리":
if (isset($_POST['id']) && isset($_POST['password'])) {
$id = $_POST['id'];
$pw = $_POST['password'];
// 1단계: ID가 존재하는지 확인
$sql = "SELECT * FROM users WHERE id = '$id'";
$result = $conn->query($sql);
if ($result && $result->num_rows > 0) {
$user = $result->fetch_assoc();
// 2단계: PW가 같은지 확인 (해시 사용 안 하는 버전)
if ($user['password'] === $pw) {
$_SESSION['id'] = $id;
header("Location: login_succ.php");
exit;
}
}
header("Location: login_fail.php");
exit;
}
break;
case "식별/인증 동시 + 해시":
if(isset($_POST['id']) && isset($_POST['password'])) {
$id = $_POST['id'];
$pw = $_POST['password'];
$sql = "SELECT * from users where id = '$id' ";
$result = $conn->query($sql);
if ($result && $result->num_rows>0) {
$user = $result->fetch_assoc();
if (password_verify($pw, $user['password'])) {
$_SESSION['id'] = $id;
header("Location: login_succ.php");
exit;
}
}
header("Location: login_fail.php");
exit;
}
break;
case "식별/인증 분리 + 해시" :
if(isset($_POST['id']) && isset($_POST['password'])) {
$id = $_POST['id'];
$pw = $_POST['password'];
$sql = "SELECT * from users where id = '$id'";
$result = $conn->query($sql);
if ($result && $result->num_rows>0) {
$user = $result->fetch_assoc();
if (password_verify($pw, $user['password'])) {
$_SESSION['id'] = $id;
header("Location: login_succ.php");
exit;
}
}
header("Location: login_fail.php");
exit;
}
break;
default :
echo "알 수 없는 로그인 방식입니다.";
}
}
// 폼이 제출되었을 때만 처리
// 사용자의 id 값과 password 값이 존재할 경우, 전달된 값을 id와pw에 변수에 저장한다.
if (isset($_POST['id']) && isset($_POST['password'])) {
$id = $_POST['id'];
$pw = $_POST['password'];
// DB에서 해당 ID의 사용자 정보 조회
$sql = "SELECT * FROM users WHERE id = '$id'";
$result = $conn->query($sql); // 위에서 만든 sql쿼리를 실제로 mysql에 실행하는 부분
if ($result->num_rows > 0) { // 사용자가 입력한 아이디가 DB에 존재하면 실행
$user = $result->fetch_assoc(); // DB 결과를 배열로 가져오기
// 비밀번호 확인
if (password_verify($pw, $user['password'])) {
$_SESSION['id'] = $id; // 세션 저장
header("Location: login_succ.php"); // 로그인 성공
exit;
} else {
header("Location: login_fail.php"); // 비밀번호 틀림
exit;
}
}
}
?>
~