Login logic [3]

DATE : 2023/11/11

다음으로 구현해볼 logic은 :

  • 식별과 인증을 따로 수행한다.

  • 보안을 위해 비밀번호에 hash를 실행한다.

이를 위해 username & password만 가지는 아주 단순한 DB를 준비해준다.

이때 password는 hash 과정을 거쳐 저장되기 때문에 위와 같이 이상한(?) 형태를 띄게 된다.

logic을 구현해보는 게 목적이기 때문에 일단은 SHA256 algorithm을 사용했다.

위와 같이 DB가 있다고 할 때, (실제로는 더 많은 사용자의 정보가 들어있을 것!)

식별과 인증을 수행하기 위한 코드는 다음과 같다.

[ login_logic3.php ]

<?php
    require_once("db_connection.php");

    $user = $_POST['user'];
    $password = $_POST['password'];
    $hash_pass = hash('sha256', $password);

    $sql = "select password from login_logic where username = '$user'"; // 식별
    $res = mysqli_query($conn, $sql);
    $record = mysqli_fetch_array($res);

    if($record['password'] == $hash_pass) { // 인증
        echo '<script>alert("Login Success")</script>';
    } else {
        echo '<script>alert("Login Fail")</script>';
    }
?>

사용자가 입력한 credential을 각각 변수로 만들어주고 난 후, 차이점이 하나 있다면

DB에는 현재 Hash 과정을 거친 비밀번호가 저장되기 때문에

$hash_pass = hash('sha256', $password);

DB의 값과 비교하기 위해선 사용자가 입력한 비밀번호를 동일한 hash로 형태를 바꿔줄 필요가 있다.

Hash function에서 말했듯이 Hash는 일방통행만 하는 함수라서

DB에 들어간 비밀번호를 다시 복원해서 사용자의 값과 비교하는 건 알맞은 방법이 아니다.

하지만 두 값을 비교는 해야 하기 때문에

반대로 사용자가 입력한 값에 hash 처리를 하는 것이다.

SELECT password FROM login_logic WHERE username = '$user'

필요한 값을 모두 준비했으면 식별을 수행한다.

사용자가 입력한 username을 DB에서 찾아 해당 row의 password를 가져오도록 한다.

if($hash_pass == $record['password'] {
    ...
} else {
    ...
}

사용자가 입력한 비밀번호에 hash 처리한 값이 DB에 저장된 값과 일치한다면 로그인 성공!

일치하지 않는 다면 사용자가 입력한 비밀번호가 틀렸다는 의미로 로그인 실패다!


이렇게 비밀번호가 Hash된 경우에는 비교할 수 있도록

사용자의 입력 값(password)을 한 번 Hash하는 과정이 필요하다는 걸 알 수 있다.

Last updated