제가 로그인 기능을 만들려고 하고 있는데 잘 안되서 물어봅니다
본문
제가 사이트 로그인을 만들어 볼려고 하는데 js랑 php를 사용해서 만들고 있었는데 테스트를 해보니까 모든 입력값이 전부 ok되지만 실질적으로 정해둔 사이트로 옮겨지지 않습니다 계정 정보는 sql에 저장하고 있고 비밀번호는 암호화(해싱)하여 저장하고 있습니다 chatgpt로도 안되는 문제라 이렇게 직접 작성합니다
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>로그인</title>
<link rel="stylesheet" href="login.css" />
<script src="login.js"></script>
</head>
<body>
<div class="login-container">
<h1 style="margin-bottom:100px;">LOGIN</h1>
<form id="login-form" class="form-group" action="/login" method="POST">
<div class="input-container">
<label for="id">아이디</label>
<input type="text" id="id" name="id" required />
</div>
<div class="input-container">
<label for="password">비밀번호</label>
<input type="password" id="password" name="password" required />
<div id="error-message" class="error-message">*아이디나 비밀번호가 잘못되었습니다</div>
</div>
<button type="submit" class="btn">로그인</button>
<a href="sign_up.html" style="color:white;">회원가입</a>
</form>
</div>
</body>
</html>
js
function validateForm() {
const id = document.getElementById('id').value;
const password = document.getElementById('password').value;
if (id === password) {
window.location.href = '/chat';
return true;
} else {
document.getElementById('error-message').style.display = 'block';
return false;
}
}
php
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = $_POST['id'];
$password_input = $_POST['password'];
$host = '호스트';
$user = "유저";
$password_db = "비밀번호";
$database = "디비";
$port = '포트';
$conn = mysqli_connect($host, $user, $password_db, $database, $port);
if (!$conn) {
die('MySQL 연결 실패: ' . mysqli_connect_error());
}
$query = "SELECT * FROM users WHERE id='$id'";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
if ($row) { // 사용자 정보가 존재하는 경우
if (password_verify($password_input, $row['password'])) {
$_SESSION['id'] = $id;
header('Location: /chat.html');
exit();
} else {
echo '<script>alert("아이디 또는 비밀번호가 일치하지 않습니다.");</script>';
echo '<script>document.getElementById("id").classList.add("error");</script>';
echo '<script>document.getElementById("password").classList.add("error");</script>';
}
} else {
echo '<script>alert("사용자가 존재하지 않습니다.");</script>';
echo '<script>document.getElementById("id").classList.add("error");</script>';
echo '<script>document.getElementById("password").classList.add("error");</script>';
}
mysqli_close($conn);
}
?>
!-->!-->!-->
답변 4
1.PHP 코드에서 header() 함수를 이용해 페이지 이동을 할 때, 경로를 잘못 입력한 부분이 있습니다.
chat.html 대신에 chat로 수정해야 합니다.
2.비밀번호를 비교할 때, password_verify() 함수를 이용해 암호화된 비밀번호를 비교해야 하는데,
현재 코드에서는 암호화하지 않은 비밀번호를 비교하고 있습니다.
따라서, 사용자가 입력한 비밀번호를 password_hash() 함수를 이용해 암호화한 뒤,
암호화된 비밀번호를 데이터베이스에서 가져와 비교해야 합니다.
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$id = $_POST['id'];
$password_input = $_POST['password'];
$host = '호스트';
$user = "유저";
$password_db = "비밀번호";
$database = "디비";
$port = '포트';
$conn = mysqli_connect($host, $user, $password_db, $database, $port);
if (!$conn) {
die('MySQL 연결 실패: ' . mysqli_connect_error());
}
$query = "SELECT * FROM users WHERE id='$id'";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
if ($row) { // 사용자 정보가 존재하는 경우
if (password_verify($password_input, $row['password'])) {
$_SESSION['id'] = $id;
header('Location: /chat');
exit();
} else {
echo '<script>alert("아이디 또는 비밀번호가 일치하지 않습니다.");</script>';
echo '<script>document.getElementById("id").classList.add("error");</script>';
echo '<script>document.getElementById("password").classList.add("error");</script>';
}
} else {
echo '<script>alert("사용자가 존재하지 않습니다.");</script>';
echo '<script>document.getElementById("id").classList.add("error");</script>';
echo '<script>document.getElementById("password").classList.add("error");</script>';
}
mysqli_close($conn);
}
?>
챗GPT 답변입니다.
!-->CI인가요? form 에 /login 만되어있는데 컨트롤러로 가게 해놓으셨나 이상하네요 ㅋ 컨트롤러아니면 login.php 로 바꾸셔요
<button class="btn">로그인</button> 로 바꾸시고
소스보면 CI는 아닌거같은데
로그인 처리할때 mysql pdo로 만드세요
그누보드는 인젝션이나 쿼리 문제 함수처리로 잘되어 있어서 문제 없지만
만약에 처음부터 만들거면 pdo 방식으로 하세요
암호처리는 따로 찾으셔야되요
https://github.com/msaad1999/PHP-Login-System
깃헙에 자료 다운받아서 이걸로 로그인 분석해보세요
보안처리 약간좀 해놓은거 있는데 나쁘진 않네요
안 되는 증상을 설명 보세요