본문 바로가기
Web/PHP

✅ PHP에서 리얼 회원가입 / 로그인 구현하기 (#7)

by Yubin Heo 2020. 4. 18.

✅ Let's Leaning PHP! - MySql 연동하기 (#6)
https://blog.hyb.kr/45  와 연결되는 내용입니다.

 

✅ Let's Leaning PHP! - MySql 연동하기 (#6)

💖 강좌 시작 전 참고사항 이 내용을 구지 이해하려 하지 않으셔도 됩니다. PHP7 이상부터는 더 이상 MySQL_* 관련 함수를 지원하지 않습니다. 따라서 MySQLi 를 이용하여 프로그래밍 해야 합니다. PHP5 버전에서..

blog.hyb.kr

 

MYSQL에서 아래와 같은 구문을 입력 해 줍니다.

USE php;

ALTER TABLE `user` CHANGE `password` `password` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

 - ALTER : 이미 존재하는 테이블의 구조나 형식등을 바꾸기 위해 사용한다
 - TABLE : TABLE을 수정하겠다는 의미이다.

 - `user' CHANGE : user 테이블을 수정하겠다는 의미임.

 - `password` `password` VARCHAR(100) : password 필드의 타입을 VARCHAR로,

   길이를 100으로 설정하겠다는 의미임.

 

💖 코드작성 (회원가입)

나머지 코드는 이전 시간과 동일합니다.

 

<!-- index.php -->

<form method="POST" action="regok.php">
    <input type="text" name="name" placeholder="Name" /> <br />
    <input type="text" name="id" placeholder="ID" /> <br />
    <input type="password" name="password" placeholder="Password" /><br />
    <input type="password" name="repassword" placeholder="Re Password" /><br />
    <button type="submit">제출</button><br />
    <a href="select.php"><button type="button">필드 조회하러 가기</button></a> &nbsp;<br />
</form>

 

그 다음, regok.php 라는 파일을 생성해 줍시다.

<?php
include "./db.php";

if($_POST["id"] == "" || $_POST["password"] == "" || $_POST["repassword"] == "" || $_POST['name'] == ""){

    echo '<script> location.href="/reg_bk"; </script>';

} else {

    echo $_POST['id'];

    if($_POST['password']!=$_POST['repassword']){
        echo '<script> alert("패스워드가 일치하지 않습니다."); history.back(); </script>';

    } else {

        $sql = mysqli_query($conn, "SELECT EXISTS (SELECT * from user WHERE id='".$_POST['id']."') as success");
        $usernamecount = $sql->fetch_array();
        if($usernamecount['success']==1) {

            echo ("<script>alert('중복된 아이디입니다!'); history.back();</script>");

        } else {

            $name = $_POST['name'];
            $id = $_POST['id'];
            $password = password_hash($_POST['password'], PASSWORD_DEFAULT);
            $date = date("Y-m-d", time());

            $result = mysqli_query($conn, "INSERT INTO user(id,password,name,created)VALUES('".$id."','".$password."','".$name."','".$date."')") or die ("알수없는 오류");
            echo ("<script>alert('회원가입이 되었습니다!'); location.href='./index.php';</script>");

        }
    }
}
?>

 

여기까지 작성하고 다시 페이지에서 값을 입력하고 제출을 누르면

회원가입이 완료되었다며 index.php로 보낼 것이다.

 

DB의 값을 확인 해 보면 아래와 같을 텐데,

첫 번째 부터, idx, id, password, name, created 테이블이다.

특히 주목해야할 부분은 password 부분이 인간의 눈으론 투시할 수 없는(?) 문자로 바뀌었는데.

이는 password_hash() 함수로 인해 암호화 된 것이다.

 

사용 형식은

password_hash(varriable, PASSWORD_DEFAULT);

 

 

 

if($_POST["id"] == "" || $_POST["password"] == "" || $_POST["repassword"] == "" || $_POST['name'] == ""){

 - 저번 시간에 POST/GET 방식으로 php파일에 값을 전송하는 방법을 배웠습니다.

   post로 전달받은 id 값과, password, repassword, name이 공백

   즉, 입력하지 않았다면 돌려보냅니다.

 

if($_POST['password']!=$_POST['repassword']){

 - 마찬가지로 password 값과 repassword 값이 일치하지 않는다면 돌려보내는 코드입니다.

 

$sql = mysqli_query($conn, "SELECT EXISTS (SELECT * from user WHERE id='".$_POST['id']."') as success");

모든 조건을 만족한다면 mysqli_query 라는 함수로 SQL문을 실행시켜 줍니다.

$conn은 db.php에서 연결한 우리의 데이터베이스를 뜻하고, 

user 테이블에서 id 필드값이 id값과 같은 필드만 불러옵니다.

 

$usernamecount = $sql->fetch_array();

 - 위에서 담아놓은 SQL 질의 값을 배열의 형태로 가져와 usernamecount 라는 변수에 넣습니다.

 

if($usernamecount['success']==1) {

 - 쉽게 생각하면 입력받은 id가 중복되면 돌려보내는 코드 입니다.

 

$password = password_hash($_POST['password'], PASSWORD_DEFAULT);

 - POST로 넘겨받은 password 값을 hash 함수로 암호화 시킵니다.

 

$result = mysqli_query($conn, "INSERT INTO user(id,password,name,created)VALUES('".$id."','".$password."','".$name."','".$date."')") or die ("알수없는 오류");

 - 위와 마찬가지로 user 테이블에 id, password, name, created 필드에

    id, password, name, date 변수값을 각각 집어넣는 SQL문을 실행합니다.

 

    오류가 난다면 알 수 없는 오류 라고 출력되고,

    만약 오류가 없다면 회원가입이 완료될 것 입니다.

 

 

💖 코드작성 (로그인)

index.php 파일을 아래와 같이 수정해 줍니다.

<!-- index.php -->

<?php include "./db.php"; ?>
<h1>회원가입</h1>
<form method="POST" action="regok.php">
    <input type="text" name="name" placeholder="Name" /> <br />
    <input type="text" name="id" placeholder="ID" /> <br />
    <input type="password" name="password" placeholder="Password" /><br />
    <input type="password" name="repassword" placeholder="Re Password" /><br />
    <button type="submit">제출</button><br />
    <a href="select.php"><button type="button">필드 조회하러 가기</button></a> &nbsp;<br />
</form>

<h1>로그인</h1>
<form method="POST" action="logok.php">
    <input type="text" name="id" placeholder="ID" /> <br />
    <input type="password" name="password" placeholder="Password" /><br />
    <button type="submit">제출</button><br />
</form>

<?php 
    if(isset($_SESSION['id'])){  ?> 

        <h2><?php echo $_SESSION['name']; ?></h2>

    <?php } else { ?>

        <h2>로그인이 필요합니다.</h2>

    <?php } ?>

 

if(isset($_SESSION['id'])){

 - 세션 id값이 있냐고 물어봅니다. (로그인 하면 세션이 생깁니다)

 

 

logok.php 파일을 만들어 줍니다.

<?php
include "./db.php";
if($_POST["id"] == "" || $_POST["password"] == ""){
    echo '<script> location.href="./login.php"; </script>';
    
} else {
    $id = $_POST['id'];
    $pwd = $_POST['password'];

    $sql = mysqli_query($conn,"select * from user where id='".$id."'") or die ("알수없는 오류");
    $member = $sql->fetch_array();
    $hash_pwd = $member['password'];

    if(password_verify($pwd, $hash_pwd)) 
    {
        $_SESSION['id'] = $member["id"];
        $_SESSION['name'] = $member["name"];

        echo "<script>alert('로그인 성공!'); location.href='./index.php';</script>";
    }
    else{
        echo "<script>alert('아이디 혹은 비밀번호를 확인하세요.'); history.back();</script>";
    }
}
?>

 

 

$sql = mysqli_query($conn,"select * from user where id='".$id."'") or die ("알수없는 오류");

 - 전송받은 id값과 db에 있는 id값이 일치하는 행을 가져옵니다. (select)

 

if(password_verify($pwd, $hash_pwd)) {

 - 기존 hash함수로 암호화된 문자열은 verify 함수로 복호화시킬 수 있습니다.

   암호화된 비밀번호를 복호화 시켰을 때 일치하냐 를 물어보는 내용입니다.

 

$_SESSION['id'] = $member["id"];
$_SESSION['name'] = $member["name"];

 - 세션 id값을 db에 id 필드로,

   세션 name값을 db에 name 필드로 넣습니다.

 

이제, logout.php 라는 파일을 만들어줍니다.

<?php
include "./db.php";
session_destroy();
?>
<script>alert("로그아웃 완료!");</script>
<meta http-equiv="refresh" content="0; url=/">

 

session_destroy();

 - 세션을 파괴합니다. (세션을 파괴함으로써 자연스럽게 로그아웃이 되는것)

 

 

수고하셨습니다!

댓글