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');
  }
}
?>

카테고리:

업데이트:

댓글남기기