인증과 식별을 다음의 네 가지로 나눠서 코드를 만들어 볼 예정이다.
1. 인증과 식별을 동시에
2. 인증과 식별을 각각
3. 1 + HASH를 적용해서
4. 2 + HASH를 적용해서
[인증과 식별을 동시에]
처음에 짰던 코드가 아이디와 비밀번호를 동시에 충족했을 때 로그인이 되는 방식이다.
<?php
require_once 'db_func.php';
function login1($id, $pw){
global $db_conn; // 데이터베이스 연결 변수를 전역으로 사용
// 사용자가 입력한 ID와 비밀번호를 데이터베이스와 비교
$check_query = "SELECT * FROM test_table WHERE name = '$id' AND pass = '$pw'";
$check_result = mysqli_query($db_conn, $check_query);
if (mysqli_num_rows($check_result) > 0) {
// 로그인 성공
return mysqli_fetch_assoc($check_result)['name']; // 사용자 ID 반환
} else {
return false;
}
}
?>
[인증과 식별을 각각]
다음은 인증과 식별이 분리된 코드이다.
<?php
require_once 'db_func.php';
function checkUserId($id) {
global $db_conn;
// 사용자가 입력한 ID의 존재 여부를 확인
$query = "SELECT * FROM test_table WHERE name = '$id'";
$result = mysqli_query($db_conn, $query);
return mysqli_num_rows($result) > 0;
}
function checkUserPassword($id, $pw) {
global $db_conn;
// 사용자가 입력한 ID와 비밀번호가 일치하는지 확인
$query = "SELECT * FROM test_table WHERE name = '$id' AND pass = '$pw'";
$result = mysqli_query($db_conn, $query);
return mysqli_num_rows($result) > 0;
}
function login1($id, $pw) {
// 먼저 아이디 존재 여부 확인
if (!checkUserId($id)) {
return false;
}
// 아이디가 존재하면 비밀번호 일치 여부 확인
if (checkUserPassword($id, $pw)) {
return $id; // 로그인 성공, 사용자 ID 반환
} else {
return false;
}
}
?>
[인증과 식별을 동시에 + HASH]
다음은 인증과 식별을 동시게 하면서 HASH를 사용해 보안을 강화한 코드이다.
<?php
require_once 'db_func.php';
function login1($id, $pw) {
global $db_conn; // 데이터베이스 연결 변수를 전역으로 사용
// 사용자가 입력한 ID를 이용해 데이터베이스에서 비밀번호 해시 가져오기
$check_query = "SELECT pass FROM test_table WHERE name = '$id'";
$check_result = mysqli_query($db_conn, $check_query);
if ($check_result && mysqli_num_rows($check_result) > 0) {
$user_data = mysqli_fetch_assoc($check_result);
$hashed_password = $user_data['pass'];
// 사용자가 입력한 비밀번호와 데이터베이스의 해시된 비밀번호 비교
if (password_verify($pw, $hashed_password)) {
// 로그인 성공
return $id; // 사용자 ID 반환
}
}
return false;
}
?>
[인증과 식별을 각각 + HASH]
다음은 인증과 식별을 각각 하면서 HASH를 통해서 보안을 강화한 코드이다.
<?php
require_once 'db_func.php';
function checkUserId($id) {
global $db_conn;
// 사용자가 입력한 ID의 존재 여부를 확인
$query = "SELECT * FROM test_table WHERE name = '$id'";
$result = mysqli_query($db_conn, $query);
return mysqli_num_rows($result) > 0;
}
function checkUserPassword($id, $pw) {
global $db_conn;
// 사용자가 입력한 ID에 해당하는 비밀번호 해시 가져오기
$query = "SELECT pass FROM test_table WHERE name = '$id'";
$result = mysqli_query($db_conn, $query);
if ($result && mysqli_num_rows($result) > 0) {
$user_data = mysqli_fetch_assoc($result);
$hashed_password = $user_data['pass'];
// 사용자가 입력한 비밀번호와 데이터베이스의 해시된 비밀번호 비교
return password_verify($pw, $hashed_password);
}
return false;
}
function login1($id, $pw) {
// 먼저 아이디 존재 여부 확인
if (!checkUserId($id)) {
return false;
}
// 아이디가 존재하면 비밀번호 일치 여부 확인
if (checkUserPassword($id, $pw)) {
return $id; // 로그인 성공, 사용자 ID 반환
} else {
return false;
}
}
?>
[번외 : 기존의 비밀번호가 평문으로 되어있다면]
기존 비밀번호를 해시와 하는 코드이다.
웹브라우저에서 저장된 파일을 호출하면 된다.
hash_passwords.php
<?php
require_once 'db_func.php'; // 데이터베이스 연결을 위한 파일 포함
function hashExistingPasswords() {
global $db_conn;
// 현재 평문으로 저장된 모든 비밀번호와 사용자 이름(name) 가져오기
$query = "SELECT name, pass FROM test_table";
$result = mysqli_query($db_conn, $query);
if (!$result) {
die("Error fetching passwords: " . mysqli_error($db_conn));
}
while ($row = mysqli_fetch_assoc($result)) {
$name = $row['name'];
$plain_password = $row['pass'];
$hashed_password = password_hash($plain_password, PASSWORD_DEFAULT);
// 해시된 비밀번호를 데이터베이스에 업데이트
$update_query = "UPDATE test_table SET pass = '$hashed_password' WHERE name = '$name'";
if (!mysqli_query($db_conn, $update_query)) {
die("Error updating password for user $name: " . mysqli_error($db_conn));
}
}
echo "All passwords have been successfully hashed and updated.";
}
hashExistingPasswords();
?>
'개발 > PHP' 카테고리의 다른 글
| [3주차 - 6] php, 비밀번호 변경페이지 만들기 (0) | 2023.11.19 |
|---|---|
| [3주차 - 5] PHP 마이페이지 만들기 (0) | 2023.11.19 |
| [3주차 - 3] Vscode sftp 변경 (0) | 2023.11.15 |
| [3주차 - 2] PHP, Session 연결과 로그아웃 (0) | 2023.11.15 |
| [3주차 - 1] PHP, HASH (비밀번호 저장, 로그인 과정) (0) | 2023.11.13 |