과제 4가지의 로그인 케이스 구현
1. 식별/인증 동시처리: 쿼리로 입력받은 ID, PW 함께 비교
2. 식별/인증 분리처리: 입력받은 ID로 데이터 조회 후 Back-End에서 IF문으로 비밀번호 비교
3. 식별/인증 동시처리 + Hash: 입력받은 PW를 Hash처리하여 쿼리로 ID, PW비교 4. 식별/인증 분리처리 + Hash: 입력받은 ID로 데이터 조회 후 Back-End에서 IF문으로 입력받은 PW를 Hash 처리하여 비교
식별/인증 동시처리
register.php( 모든 케이스 동일)
<?php
require_once 'db_connection.php';
$is_id = isset($_POST['id']) && $_POST['id'];
$is_name = isset($_POST['name']) && $_POST['name'];
$is_pw = isset($_POST['pw']) && $_POST['pw'];
$is_submit = isset($_POST['submit']);
if ($is_name && $is_id && $is_pw && $is_submit) {
// 모두 입력받았다면 아이디 중복확인.
$idCount = idCount($_POST['id']);
if($idCount < 1) {
$result = register($_POST['id'], $_POST['name'], $_POST['pw']);
if ($result) {
echo "<script>alert('회원가입 완료.');
location.href='/study/w3/case1/login.php'
</script>";
exit;
}
}
}
?>
login.php (모든 케이스 동일)
<?php
require_once 'db_connection.php';
ini_set('display_errors', 1);
$is_id = isset($_POST['id']) && $_POST['id'];
$is_pw = isset($_POST['pw']) && $_POST['pw'];
$is_submit = isset($_POST['submit']);
if($is_id && $is_pw && $is_submit) {
// 로그인 로직 처리
$login_result = login($_POST['id'], $_POST['pw']);
if ($login_result > 0) {
session_start();
// echo "userID: {$id}";
$_SESSION['id'] = $_POST['id'];
header('Location: /study/w3/case1/index.php');
}
}
?>
db_connection.php
<?php
ini_set('display_errors', 1);
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'student1234');
define('DB_NAME', 'test');
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
$db_conn -> set_charset('utf8');
// 중략
function login($id, $pw) {
global $db_conn;
// sql에서 id, pw 모두 사용
$sql = "SELECT COUNT(USER_ID) as count
FROM user_case1
WHERE USER_ID = '{$id}' and PW = '{$pw}'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
return $row['count'];
}
?>
쿼리에서 USER_ID, PW 모두 조건절로 처리하여 count만 반환하여 0보다 크다면 로그인 처리한다.
식별/인증 별도 처리
db_connection.php
<?php
ini_set('display_errors', 1);
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'admin');
define('DB_PASSWORD', 'student1234');
define('DB_NAME', 'test');
$db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
$db_conn -> set_charset('utf8');
// 중략
function login($id, $pw) {
global $db_conn;
$return_val = 0;
$sql = "SELECT USER_ID AS userId, PW AS pw
FROM user_case1
WHERE USER_ID = '{$id}'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if($row && $row['pw'] == $pw) {
$return_val = 1;
}
return $return_val;
}
?>
입력받은 USER_ID를 사용하여 DB에서 USER_ID, PW를 받아 PHP 로직에서 PW를 비교하여 로그인 처리 한다.
식별/인증 동시처리 + Hash
db_connection.php
<?php
// 중략
function register($id, $name, $pw) {
global $db_conn;
$pw = hash("sha256", $pw);
$sql = "INSERT INTO user_case3 (USER_ID, USER_NM, PW) VALUE(
'{$id}'
, '{$name}'
, '{$pw}'
)";
return mysqli_query($db_conn, $sql);
}
function login($id, $pw) {
global $db_conn;
$pw = hash("sha256", $pw);
$sql = "SELECT COUNT(USER_ID) as count
FROM user_case1
WHERE USER_ID = '{$id}' and PW = '{$pw}'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
return $row['count'];
}
?>
register에서 Insert 하기 전 pw를 Hash 처리한다.
이후 login 시 조건절에 들어갈 pw 또한 해시처리하여 비교한다.
해시처리 된 pw
식별/인증 별처리 + Hash
db_connection.php
<?php
// 중략
function login($id, $pw) {
global $db_conn;
$pw = hash("sha256", $pw);
$return_val = 0;
$sql = "SELECT USER_ID AS userId, PW AS pw
FROM user_case3
WHERE USER_ID = '{$id}'";
$result = mysqli_query($db_conn, $sql);
$row = mysqli_fetch_array($result);
if($row && $row['pw'] == $pw) {
$return_val = 1;
}
return $return_val;
}
?>
Case2와 동일하지만 DB에서 가져온 PW는 Hash처리가 되어 있기 때문에 파라미터로 받는 $pw를 Hash처리하여 if문에서 비교한다.