본문 바로가기

웹 모의해킹 스터디/웹 개발 (PHP | MySQL)

[3주차] [php / mysql] 4가지 로그인 과정 구현

3주차 과제

  1. 식별 / 인증 동시
  2. 식별 / 인증 분리
  3. 식별 / 인증 동시 (+ 비밀번호 HASH)
  4. 식별 / 인증 분리 (+ 비밀번호 HASH)

 

로그인에 대해 작성된 아래 글의 로그인 로직을 좀 더 자세히 구현할 것이다.

 

로그인은 식별과 인증으로 나뉜다

로그인이란? 시스템에 자기 자신을 증명하는 것 로그인 과정은 크게 식별과 인증으로 나뉜다. > 식별 시스템 내 수많은 사용자 중에서 특정한 사용자를 찾아내는 작업 사용자가 로그인할 때 식

studysteadily.tistory.com

 

 

로그인 로직은 2주차에 구현해놓은 login_proc.php을 수정하여 작성했다.

 

[2주차] 로그인 / 회원가입 페이지 만들기 | php, mysql

2주차 과제 회원가입 페이지 만들기 (기능 구현) 로그인 페이지 ( DB 연동하기) 1주차 과제가 아무리 봐도 마음에 안들어서 코드를 거의 다 바꿨다. 그냥 새로 시작했다고 해도 무방하당ㅎ 회원가

studysteadily.tistory.com

 


 

 

1. 식별 / 인증 동시

login1.php

<?php
    session_start();
    include "db_conn.php";

    $id = $_POST['id'];
    $pw = $_POST['pw'];

    //일치하는 식별정보와 인증정보가 존재하는지 확인
    $sql = "select * from regist where userid='$id' and userpw='$pw'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result);
	
    if($row){ // 쿼리 결과가 존재하면 로그인 성공
        $_SESSION['name'] = $row['username'];
        mysqli_close($db_conn);
        header("Location: index.php");
    }else{ // 존재하지 않으면 로그인 실패
        echo "<script>
            alert(\"비밀번호가 일치하지 않습니다.\");
            history.back();
            </script>";
             exit;
    }
?>

 

 

 2. 식별 / 인증 분리

login2.php

<?php
    session_start();
    include "db_conn.php";
    
    $id = $_POST['id'];
    $pw = $_POST['pw'];

    // 식별 정보(id)만 이용하여 일치하는 데이터 있는지 검사
    $sql = "select * from regist where userid='$id'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result); 
   
    if(!$row){ // id 존재 여부 확인 ==> 식별
        echo "<script> 
        alert(\"일치하는 아이디가 없습니다.\");
        history.back();
        </script>";
        exit;
    } else{ // 일치하는 id가 있으면, 인증정보(pw) 확인 ==> 인증
        if($row['userpw'] != $pw){ // pw 일치하지 않으면 로그인 실패
            echo "<script>
                    alert(\"비밀번호가 일치하지 않습니다.\");
                    history.back();
                </script>";
                exit;
        }else{ // pw 일치하면 로그인 성공
            $_SESSION['name'] = $row['username'];
            mysqli_close($db_conn);
            header("Location: index.php");
        }
    }
?>

 

 

 

위의 방식에 비밀번호 해시를 추가한 3, 4번 방식을 구현하기 전에,  회원가입 시 해시화된 비밀번호가 db에 저장되도록 회원가입 처리 코드를 변경하였다.

 

HashRegist_proc.php

<?php
    include "db_conn.php";

    $pw = $_POST['pw'];
    // sha256 알고리즘으로 비밀번호 해시값 구하기
    $hashed_passwd = hash('sha256', $pw);
    // 비밀번호 평문이 아닌 해시값 저장
    $sql = "insert into regist values(null, '{$_POST['name']}', '{$_POST['id']}', '$encrypted_passwd', now())";
    $result = mysqli_query($db_conn, $sql);

    if($result === false){ /* === 이면 자료형까지 일치하는지 확인 */
        echo "저장에 문제가 생겼습니다. 관리자에게 문의 바랍니다.";
        echo mysqli_error($db_conn);
    } else{?>
        <script>
            alert("회원가입이 완료되었습니다.")
            location.href="index.php"
        </script>; 
 <?php
    }
 ?>

 

php의 hash 함수로 비밀번호의 해시값을 구했다. hash 함수의 사용은 다음과 같다.

 

hash ( string $algo , string $data, [ bool $raw_output = false ] )

  • $algo : 해시 알고리즘 (md5, sha256 ...)
  • $data : 해시 알고리즘을 적용할 데이터
  • $raw_output : TRUE일 경우 바이너리 데이터로 결과 반환, FALSE일 경우 소문자 hex 값으로 반환

 

해시 알고리즘은 md5보다 안전한 sha256을 이용하였다. (md5는 충돌 문제도 존재한다고 한다.)

 

3. 식별 / 인증 동시 (+ HASH)

login3.php

<?php
    session_start();
    include "db_conn.php";

    $id = $_POST['id'];
    $pw = $_POST['pw'];
    // sha256 알고리즘으로 pw의 해시값 구하기
    $hashed_pw = hash('sha256', $pw);

    // 일치하는 식별정보와 인증정보가 존재하는지 확인
    $sql = "select * from regist where userid='$id' and userpw='$hashed_pw'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result);

    if($row){
        $_SESSION['name'] = $row['username'];
        mysqli_close($db_conn);
        header("Location: index.php");
    }else{
        echo "<script>
            alert(\"비밀번호가 일치하지 않습니다.\");
            history.back();
            </script>";
             exit;
    }
?>

 

4. 식별 / 인증 분리 (+ HASH)

login4.php

<?php
    session_start();
    include "db_conn.php";    

    $id = $_POST['id'];
    $pw = $_POST['pw'];
    // sha256 알고리즘으로 비밀번호 해시값 구하기
    $hashed_pw = hash('sha256', $pw);

    // 식별 정보(id)만 이용하여 일치하는 데이터 있는지 검사
    $sql = "select * from regist where userid='$id'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result);
    
    if(!$row){ // id 존재 여부 확인 ==> 식별
        echo "<script> 
        alert(\"일치하는 아이디가 없습니다.\");
        history.back();
        </script>";
        exit;
    } else{ // 일치하는 id가 있으면, 인증정보(pw) 확인 ==> 인증
        if($row['userpw'] != $hashed_pw){ // pw 일치하지 않으면 로그인 실패
            echo "<script>
                    alert(\"비밀번호가 일치하지 않습니다.\");
                    history.back();
                </script>";
                exit;
        }else{ // pw 일치하면 로그인 성공
            $_SESSION['name'] = $row['username'];
            mysqli_close($db_conn);
            header("Location: index.php");
    }
?>