3주차 로그인의 식별과 인증, 해싱처리하기
1.로그인의 식별과 인증 4가지 만들기
로그인을 하기 위해서 식별과 인증을 해야 한다는 것을 배웠습니다.
이론적인 것은 간단한 로직으로 작성할 수 있고, 쉽게 찾아 볼 수 있기 때문에
제가 만든 로그인 폼의 식별과 인증을 살펴보도록 하겠습니다.
1.1 식별과 인증 동시에 진행
▶1번 방식
<?php
session_start(); # 세션 파트에서 보았듯 로그인을 유지하기 위해 사용.
include 'db.php'; # db.php db를 연결한 스크립트를 현재 스크립트에 포함시킴.(db를 이용하기위함)
if ($_SERVER["REQUEST_METHOD"] == "POST") { #요청받은 방식이 post일때만 진행 # if의()는 true를 뜻한다.
$id = $_POST['id']; #로그인 폼에 사용자가 입력한 id
$password = $_POST['password']; #로그인 폼에 사용자가 입력한 password
#db로부터 사용자가 작성한 id password 둘다 맞는 데이터를 찾음(식별과 인증이 동시에 들어감)
$sqls = "SELECT * FROM DATA WHERE id='$id' AND psw='$password'";
$result = mysqli_query($conn,$sqls); #그 데이터에 대한 쿼리를 실행
$row = mysqli_fetch_array($result); #그 결과를 배열형식으로 가져옴
if (isset($row['id'])){ #그 결과의 id가 존재하면 로그인 성공페이지로, 아니면 실패페이지로 각각보냄.
$_SESSION['Username']=$_POST['id']; #로그인을 성공했을때 id를 세션에 저장하여, 로그인 유지
header('Location: /login_success.php');
exit();
}else{
header('Location: /index.php?incorrect=invaild login name or password');
exit();
}
}
?>
▶2번 방식
<?php
session_start(); # 세션을 시작
include 'db.php'; # 데이터베이스 연결 파일을 포함
if ($_SERVER["REQUEST_METHOD"] == "POST") { # post방식인 것만 진행(확인하는 용도)
$id = $_POST['id']; # 로그인 폼에 사용자가 입력한 id
$password = $_POST['password']; # 로그인 폼에 사용자가 입력한 password
#db로부터 사용자가 작성한 id password 둘다 맞는 데이터를 찾음(식별과 인증이 동시에 들어감)
$sql = "SELECT id FROM data WHERE id = '$id' AND psw = '$password'";
$result = mysqli_query($conn,$sql); # 쿼리실행, 다른방법은$conn->query($sql);
if ($result->num_rows > 0) { # 일치하는 사용자가 하나 이상 있는 경우
$user = $result->fetch_assoc(); # db로 id 정보 가져옴.fetch_assoc은 배열이 아닌 정보만 가져옴.
$_SESSION['user_id'] = $user['id']; # id정보 세션에 저장
header("Location: login_success.php");
} else {
header('Location: /index.php?incorrect=invaild login name or password');
}
}
?>
1.2 식별과 인증 분리해서 진행
<?php
session_start(); # 세션을 시작
include 'db.php'; # 데이터베이스 연결 파일을 포함
if ($_SERVER["REQUEST_METHOD"] == "POST") { # post방식인 것만 진행(확인하는 용도)
$id = $_POST['id']; # 로그인 폼에 사용자가 입력한 id
#db로부터 사용자가 작성한 id와 같은 데이터를 찾음(식별만 진행)
$sql = "SELECT id,psw FROM data WHERE id = '$id'";
$result = mysqli_query($conn,$sql); #쿼리실행
if ($result->num_rows > 0) { # 일치하는 사용자가 하나 이상 있는 경우
$password = $_POST['password']; # 로그인 폼에 사용자가 입력한 password
$user = $result->fetch_assoc(); # db로부터 id,password 정보 가져옴.
# db로부터 가져온 password가 사용자가 작성한 password와 같은지 확인. 맞으면 성공페이지,틀리면 실패페이지로 이동
if($user['psw']=='$password'){
$_SESSION['User_id'] = $user['id']; # id정보 세션에 저장,로그인 유지를 위함.
header("Location: login_success.php");
} else {
header('Location: /index.php?incorrect=invaild+login+name+or+password');
}
} else {
header('Location: /index.php?incorrect=invaild+login+name+or+password');
}
}
?>
1.3 hash를 이용한 식별과 인증 동시에 진행
위와 마찬가지로 거의 같지만 해싱처리된 비밀번호를 확인하는 과정을 거친다.
<?php
session_start(); # 세션을 시작
include 'db.php'; # 데이터베이스 연결 파일을 포함
if ($_SERVER["REQUEST_METHOD"] == "POST") { # post방식인 것만 진행(확인하는 용도)
$id = $_POST['id']; # 로그인 폼에 사용자가 입력한 id
$password = $_POST['password']; # 로그인 폼에 사용자가 입력한 password
$hased_password = password_hash($password, PASSWORD_DEFAULT); #해싱처리된 입력한 비밀번호
#db로부터 사용자가 작성한 id password 둘다 맞는 데이터를 찾음(식별과 인증이 동시에 들어감)
$sql = "SELECT id FROM data WHERE id = '$id' AND psw = '$hased_password'";
$result = mysqli_query($conn,$sql); # 쿼리실행, 다른방법은$conn->query($sql);
if ($result->num_rows > 0) { # 일치하는 사용자가 하나 이상 있는 경우
$user = $result->fetch_assoc(); # db로 id 정보 가져옴.fetch_assoc은 배열이 아닌 정보만 가져옴.
$_SESSION['user_id'] = $user['id']; # id정보 세션에 저장
header("Location: login_success.php");
} else {
header('Location: /index.php?incorrect=invaild login name or password');
}
}
?>
1.4 hash를 이용한 식별과 인증 분리해서 진행
중요한 점은 인증하는 과정에서 해싱처리된 비밀번호와 사용자가 작성한 비밀번호를 어떻게 확인하는가 입니다.
<?php
session_start();
include 'db.php';
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$id = $_POST['id'];
$sql = "SELECT id,psw FROM data WHERE id = '$id'";
$result = mysqli_query($conn,$sql);
if ($result->num_rows > 0) {
$password = $_POST['password'];
$user = $result->fetch_assoc();
#해싱처리된 비밀번호가 db에 저장되어있는 것을 가져왔다. 사용자가 작성한 비밀번호가 맞는지 확인이 필요하다!!
#password_verify: 해싱된 비밀번호와 작성한 비밀번호 확인할때 사용.
if(password_verify($password,$user['psw'])) {
$_SESSION['User_id'] = $user['id'];
header("Location: login_success.php");
} else {
header('Location: /index.php?incorrect=invaild+login+name+or+password');
}
} else {
header('Location: /index.php?incorrect=invaild+login+name+or+password');
}
}
?>
댓글남기기