Login logic [5]

DATE : 2023/11/11

이번에 살펴볼 코드는 Hash된 비밀번호를 다루는 방법이 조금 달라서

정리해보기로 했다.

비밀번호에 Hash를 적용하는 방법은 여러 가지겠지만 앞에서 사용한 방법은

hash('algorithm', $password)

hash 함수를 사용하는 것이었다.

hash 함수도 여러 가지 알고리즘이 있기 때문에 사용할 알고리즘을 지정해주고

Hash 처리할 비밀번호를 두 번째 인수로 적어주는 형태이다.

PHP에는 hash 함수와 유사한 password_hash 함수가 존재한다.

password_hash($password, 'algorithm')

hash 함수와 전달하는 인수의 순서가 반대인 걸 유의하도록 하자.

이 함수의 제일 큰 특징은 password_hash 결과로 나온 값을 (= hash 처리된 비밀번호)

사용자가 입력한 평문 비밀번호와 비교하기 위한 방법이다.


앞에서 살펴본 예시로는 hash 처리된 비밀번호를 다시 복원할 수 없기 때문에

사용자가 입력한 비밀번호에 동일한 hash 함수를 실행해 두 값을 비교할 수 있는 형태로 만들었다.

그.런.데

이상하게도 password_hash 함수를 사용하게 되면

동일한 비밀번호를 입력해도 만들어지는 hash 값이 달라진다.

그렇다 보니 회원 가입 과정에서 입력한 비밀번호와 동일한 값을 입력해도

계속 로그인에 실패하는 문제가 발생했다..!

찾아보니 password_hash로 생성된 hash 값은 평문 비밀번호와 일치하는 지 확인하기 위해

password_verify function을 사용해야 한다고 한다.

[ login_logic5.php ]

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

    $user = $_POST['user'];
    $pass = $_POST['password'];
    
    $sql = "select password from user where username='$user'"; //식별 
    $res = mysqli_query($conn, $sql);

    $record = mysqli_fetch_array($res);

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

현재 DB에는 password_hash 함수로 만들어진 값이 들어가 있고

username이 일치하는 row를 찾아서 해당 row의 비밀번호를 가져온다고 했을 때

이를 비교하는 방법이 아래와 같음을 확인할 수 있다.

if(password_verify($pass, $record['password']) {
    ...
}

password_verify 함수는 password_hash 함수로 만들어진 hash 값과 비밀번호를 주면

전달한 hash 값이 비밀번호로 만들어진 hash가 맞는 지 확인해서 True or False를 반환한다.

즉, username이 일치하는 row를 가져왔을 때

해당 row의 비밀번호와 사용자가 입력한 비밀번호를 넘겨주면 password_verify 결과로

True (or False)가 나와 인증에 성공 했는지, 실패 했는지 여부를 알 수 있게 되는 것이다.

만약 password_hash 함수를 사용한다면 꼭 알아야 하는 내용인 듯하여 정리를 해보았다.

이렇게 해서! 비슷해 보이지만 조금씩 다른 Login logic에 대해 살펴보았다!!

각각의 logic을 살펴보는 것도 좋지만

Logic 간의 차이점도 고려해서 정리해보면 더 도움이 될 듯하다! 😄

Last updated