인증 과정에 솔트 추가하기
이제 우리는 인증 방식을 변경해야 합니다. 여기서는 변경 사항이 더욱 실질적일 것입니다.
더 이상 로그인-패스워드 쌍을 하나의 쿼리로 즉시 확인하는 것은 불가능합니다. 그 이유는: 패스워드를 확인하려면 솔팅된 해시를 얻어야 하는데, 솔트는 데이터베이스에 저장되어 있으며 각 로그인마다 고유하기 때문입니다.
먼저 로그인으로만 레코드를 가져와서 솔트를 읽고, 입력된 패스워드에 솔트를 추가한 후 데이터베이스의 솔팅된 패스워드와 비교해야 하며, 오직 그것들이 일치할 때만 사용자를 인증해야 합니다.
로그인이 잘못 입력된 경우도 있을 수 있다는 점을 유의하세요. 이 경우 패스워드 확인을 수행할 필요 없이, 즉시 인증이 불가능하다는 메시지를 표시할 수 있습니다:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
// 해당 로그인을 가진 사용자가 있음, 이제 패스워드를 확인해야 함...
} else {
// 해당 로그인을 가진 사용자가 없음, 메시지를 출력함
}
?>
패스워드 확인을 추가해 봅시다:
<?php
$login = $_POST['login'];
$query = "SELECT * FROM users WHERE login='$login'";
$res = mysqli_query($link, $query);
$user = mysqli_fetch_assoc($res);
if (!empty($user)) {
$salt = $user['salt']; // DB에서 가져온 솔트
$hash = $user['password']; // DB에서 가져온 솔팅된 패스워드
$password = md5($salt . $_POST['password']); // 사용자로부터의 솔팅된 패스워드
// 솔팅된 해시를 비교함
if ($password == $hash) {
// 모두 정상, 인증함...
} else {
// 패스워드가 일치하지 않음, 메시지를 출력함
}
} else {
// 해당 로그인을 가진 사용자가 없음, 메시지를 출력함
}
?>
보안을 위해 일반적으로 사용자에게 무엇이 맞지 않는지(로그인인지 패스워드인지) 알려주지 않습니다. 이는 해커가 로그인-패스워드 쌍을 추측하는 것을 어렵게 만들기 위함입니다. 단순히 로그인-패스워드 쌍이 잘못되었다는 메시지나 이와 유사한 내용을 표시합니다.
위에서 설명한 솔팅된 패스워드 인증을 구현하세요. 회원가입을 하고, 로그인을 시도하여 모든 것이 작동하는지 확인해 보세요.