TOKEN을 이용한 인증 

Cookie를 이용한 방식은 Client에서 데이터를 관리하고 전달하기 때문에 변조에 취약하다.

Session을 이용한 방식은 데이터가 Session에 저장되기 때문에 사용자가 많다면 부하가 발생한다.

 

Token의 방식은 Cookie의 방식과 유사하다. 다만 서버로 전달되는 데이터가 Token이 되는 것이다.

서버는 전달받은 Token의 유효성을 검사하여 로그인 여부를 확인한다.

 

 


 

JWT (Json Web Token)

JWT는 Json 형태의 데이터를 암호화한 토큰을 의미하며 3가지 파트로 나뉘어 있다.

JWT.io 사이트

JWT는 Header, PayLoad, Sigature로 이루어져 있으며 각 파트는 .(dot)으로 연결되어있다.

즉 Header.PayLoad.Signature 형식이다. (Header와 PayLoad는 Base64 인코딩을 하여 사용한다.)

 

Header: 알고리즘의 형식을 기술하는 부분

PayLoad: 사용자(개발자)가 필요한 데이터를 기술하는 부분

Signature: JWT가 변조되었는지 확인하는 부분

 

Token은 클라이언트에서 소유하고 있기에 변조의 가능성이 있다. 이를 해결하기위해 Signature가 존재하며 Signature는 Header, PayLoad, secret(개발자가 지정한 암호)를 사용하여 Hash 단반향 암호화를 진행한다.

이를 이용하여 서버가 요청을 받았을 때 Token의 Header, PayLoad, Secret을 사용하여 검증용 Signature를 만들고 전달 받은 Token의 Signature와 비교하여 변조 유무를 확인한다.

 

위와 같은 특성 때문에 JWT는 클라이언트에서 소유하고 있지만 변조의 탐지가 쉬우며 Session과 같이 서버에 저장되는 정보가 존재하지 않기 때문에 상대적으로 적은 부하를 발생한다.

 


JWT를 사용한 로그인 구현

jwt.php

<?php
  class JWT {
    protected $alg;
    protected $secret_key;
    // define('EXPIRE_ERROR', '401');
    // define('SIGNITURE_ERROR', 'ERROR');

    //    생성자
    function __construct()
    {
        //사용할 알고리즘
        $this->alg = 'sha256';
        // 비밀 키
        $this->secret_key = "normaltic";
    }

//    jwt 발급하기
    function hashing(array $data): string
    {
        // 헤더 - 사용할 알고리즘과 타입 명시
        $header = json_encode(array(
            'alg' => $this->alg,
            'typ' => 'JWT'

        ));

        // 페이로드 - 전달할 데이터
        $payload = json_encode($data);
        // 시그니처
        $signature = hash($this->alg, $header . $payload . $this->secret_key);

        return base64_encode($header . '.' . $payload . '.' . $signature);
    }

//    jwt 해석하기
    function dehashing($token)
    {
        // 구분자 . 로 토큰 나누기
        $parted = explode('.', base64_decode($token));

        $signature = $parted[2];

        // 토큰 만들 때처럼 시그니처 생성 후 비교
        if (hash($this->alg, $parted[0] . $parted[1] . $this->secret_key) != $signature) {
            return 0;
        }

        // 만료 검사
        $payload = json_decode($parted[1], true);
        if ($payload['exp'] < time()) { // 유효시간이 현재 시간보다 전이면
            return 0;
        }


        return json_decode($parted[1], true);
    }

    // 유효성 체크 
    function verify($token) {
        $parted = explode('.', base64_decode($token));
        $signature = $parted[2];

        // 토큰 만들 때처럼 시그니처 생성 후 비교
        if (hash($this->alg, $parted[0] . $parted[1] . $this->secret_key) != $signature) {
            return 0;
        }

        // 만료 검사
        $payload = json_decode($parted[1], true);
        if ($payload['exp'] < time()) { // 유효시간이 현재 시간보다 전이면
            return 0;
        }
        return 1;
    }
}

 $jwt = new JWT();
?>

 

login.php

<?php
        require_once './lib/login_function.php';
        require_once './lib/jwt.php';
        ini_set('display_errors', 1);
        
        $is_id = isset($_POST['id']) && $_POST['id'];
        $is_pw = isset($_POST['pw']) && $_POST['pw'];
        $is_submit = isset($_POST['submit']);
        
        setcookie("PHPSESSID", "delete", time() - 3600, "/");
      
        if($is_id && $is_pw && $is_submit) {
          // 로그인 로직 처리
          $login_result = login($_POST['id'], $_POST['pw']);
          echo $login_result;
          if ($login_result > 0) {

            $token = $jwt->hashing(array(
              'exp' => time() + (360 * 30), // 만료기간
              'iat' => time(), // 생성일
              'id' => $_POST['id']
            ));

            $refreshToken = $jwt->hashing(array(
              'exp' => time() + (360 * 60), // 만료기간
              'iat' => time(), // 생성일
              'id' => $_POST['id']
            ));
            
            $update = updateRefreshToken($refreshToken, $_POST['id']);
            if ($update){
              setcookie('TOKEN', $token, time() + (360 * 30), "/");
              setcookie('REFRESH_TOKEN', refreshToken, time() + (360 * 60), "/");
              header('Location: index.php');
            }
          }
        }
      ?>

 

login_function.php

<?php
    require_once 'db_connection.php';
    
    
    function idCount($id) {
        global $db_conn;

        $sql = "select count(USER_ID) as count from user where USER_ID ='" . $id . "'";
        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);
        return $row['count'];
    }
    
    
    function register($id, $name, $pw) {
        global $db_conn;
        
        $pw = hash("sha256", $pw);
        // echo "pw : {$pw}";

        $sql = "INSERT INTO user (USER_ID, USER_NM, PW) VALUE(
            '{$id}'
            , '{$name}'
            , '{$pw}'
        )";

        echo "sql: {$sql}";

        return mysqli_query($db_conn, $sql);
    }

    function login($id, $pw) {
        global $db_conn;
        $pw = hash("sha256", $pw);
        $sql = "SELECT COUNT(USER_ID) as count 
        FROM user
        WHERE USER_ID = '{$id}' and PW = '{$pw}'";

        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);

        return $row['count'];
    }

    function updateRefreshToken($refresh, $id) {
        global $db_conn;

        $sql = "update user set REFRESH_TOKEN = '{$refresh}' where USER_ID = '{$id}'";
        return mysqli_query($db_conn, $sql);
    } 
?>

 

 

index.php

<?php
  require_once './lib/jwt.php';
  ini_set('display_errors', 1);
  session_start();
  

  if(!isset($_COOKIE['TOKEN']) || !$jwt -> verify($_COOKIE['TOKEN']) ) {
      header('location:login.php');
      eixt;
  }
  $token = $_COOKIE['TOKEN'];
  echo '<br>';
  // var_dump($token);
  echo "decode: {$jwt->dehashing($token)['id']}";
?>

 

 

이후 로그인이 필요한 페이지로 이동 시 Token을 사용하여 로그인 여부를 확인하면 된다.

 

index.php

'웹 해킹 코스 > 과제' 카테고리의 다른 글

4-2 게시판 구현하기(게시판 등록)  (0) 2023.11.19
4-1 javascript를 사용한 키로거  (0) 2023.11.16
3-1(로그인 케이스)  (0) 2023.11.09
2-2 DB를 사용한 회원가입, 로그인  (0) 2023.11.02
2-1 php와 DB연결  (0) 2023.11.02

과제 4가지의 로그인 케이스 구현

1. 식별/인증 동시처리: 쿼리로 입력받은 ID, PW 함께 비교

2. 식별/인증 분리처리: 입력받은 ID로 데이터 조회 후 Back-End에서 IF문으로 비밀번호 비교

3. 식별/인증 동시처리 + Hash: 입력받은 PW를 Hash처리하여 쿼리로 ID, PW비교
4. 식별/인증 분리처리 + Hash: 입력받은 ID로 데이터 조회 후 Back-End에서 IF문으로 입력받은 PW를 Hash 처리하여 비교

 


식별/인증 동시처리

register.php( 모든 케이스 동일)

    <?php
      require_once 'db_connection.php';

      $is_id = isset($_POST['id']) && $_POST['id'];
      $is_name = isset($_POST['name']) && $_POST['name'];
      $is_pw = isset($_POST['pw']) && $_POST['pw'];
      $is_submit = isset($_POST['submit']);

      if ($is_name && $is_id && $is_pw && $is_submit) {
        // 모두 입력받았다면 아이디 중복확인.
        $idCount = idCount($_POST['id']);

        if($idCount < 1) {
          $result = register($_POST['id'], $_POST['name'], $_POST['pw']);
          if ($result) {
            echo "<script>alert('회원가입 완료.');
              location.href='/study/w3/case1/login.php'
            </script>";
            exit;
          }
        } 
      }
    ?>

 

 

login.php (모든 케이스 동일)

<?php
        require_once 'db_connection.php';
        ini_set('display_errors', 1);
        
        $is_id = isset($_POST['id']) && $_POST['id'];
        $is_pw = isset($_POST['pw']) && $_POST['pw'];
        $is_submit = isset($_POST['submit']);
           
        if($is_id && $is_pw && $is_submit) {
          // 로그인 로직 처리
          $login_result = login($_POST['id'], $_POST['pw']);
          
          if ($login_result > 0) {
            session_start();
            // echo "userID: {$id}";
            $_SESSION['id'] = $_POST['id'];
            header('Location: /study/w3/case1/index.php');
          }
        }
      ?>

 

db_connection.php

<?php
    ini_set('display_errors', 1);
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');
	
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    $db_conn -> set_charset('utf8');
   
   // 중략
   
    function login($id, $pw) {
        global $db_conn;
        
        // sql에서 id, pw 모두 사용
        $sql = "SELECT COUNT(USER_ID) as count 
        FROM user_case1 
        WHERE USER_ID = '{$id}' and PW = '{$pw}'";
	
        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);

        return $row['count'];
    }
?>

 

쿼리에서 USER_ID, PW 모두 조건절로 처리하여 count만 반환하여 0보다 크다면 로그인 처리한다.


식별/인증 별도 처리

db_connection.php

<?php
    ini_set('display_errors', 1);
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');
	
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    $db_conn -> set_charset('utf8');
  
  	// 중략
  
    function login($id, $pw) {
        global $db_conn;
        $return_val = 0;
        $sql = "SELECT USER_ID AS userId, PW AS pw
        FROM user_case1 
        WHERE USER_ID = '{$id}'";

        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);

        if($row && $row['pw'] == $pw) {
            $return_val = 1;
        } 

        return $return_val;
        

    }
?>

 

입력받은 USER_ID를 사용하여 DB에서 USER_ID, PW를 받아 PHP 로직에서 PW를 비교하여 로그인 처리 한다.

 


식별/인증 동시처리 + Hash

db_connection.php

<?php
    // 중략
    
    function register($id, $name, $pw) {
        global $db_conn;
        
        $pw = hash("sha256", $pw);
        $sql = "INSERT INTO user_case3 (USER_ID, USER_NM, PW) VALUE(
            '{$id}'
            , '{$name}'
            , '{$pw}'
        )";

        return mysqli_query($db_conn, $sql);
    }

    function login($id, $pw) {
        global $db_conn;
        $pw = hash("sha256", $pw);
        
        $sql = "SELECT COUNT(USER_ID) as count 
        FROM user_case1 
        WHERE USER_ID = '{$id}' and PW = '{$pw}'";

        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);

        return $row['count'];
    }
?>

 

register에서 Insert 하기 전 pw를 Hash 처리한다.

이후 login 시 조건절에 들어갈 pw 또한 해시처리하여 비교한다.

해시처리 된 pw


식별/인증 별처리 + Hash

db_connection.php

<?php
    // 중략
    
    function login($id, $pw) {
        global $db_conn;
        $pw = hash("sha256", $pw);
        $return_val = 0;

        $sql = "SELECT USER_ID AS userId, PW AS pw
        FROM user_case3 
        WHERE USER_ID = '{$id}'";

        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);

        if($row && $row['pw'] == $pw) {
            $return_val = 1;
        } 

        return $return_val;
    }
?>

 

Case2와 동일하지만 DB에서 가져온 PW는 Hash처리가 되어 있기 때문에 파라미터로 받는 $pw를 Hash처리하여 if문에서 비교한다.

식별/인증

식별: 수 많은 사용자 데이터 중 1개의 사용자를 특정(ID)
인증: 식별한 사용자가 실제 그 사용자가 맞는지 확인(PW)

식별정보: 로그인에서 ID가 식별정보이며 식별정보는 특정 1명의 사용자를 찾을 수 있어야하므로 유니크해야 한다.
인증정보: 로그인 시도한 사용자가 정말 그 사용자인지 확인하기 위해 사용자만 알 수 있는 값을 받아야한다 (PW)


Hash

Hash는 단방향 암호화 로직으로 (A ===HASH 처리 ===> B) 가능하지만 ( A <========= B)가 불가능하다
이러한 특징을 가지고 있기 때문에 BD가 탈취되어도 평문을 알 수 없다.

로그인 시 입력받은 비밀번호를 Hash처리하여 DB에 저장된 값과 비교만 하면되기 때문에 사용자의 비밀번호를 알 필요가 없다.


로그인 로직 방법들

  1. 식별/인증 동시처리: DB에서 동시에 식별정보 and 인증정보를 조회한다.
  2. 식별/인증 별도처리: DB에서 식별정보를 조회 후 Back-End의 if문으로 확인한다.
  3. 식별/인증 동시처리 + Hash : DB에 입력된 PW는 해쉬 처리가 되어 있으며 쿼리의 조건문에도 해쉬처리된 데이터로 조회한다.
  4. 식별/인증 별도처리 + Hash : DB에 입력된 PW는 해쉬 처리가 되어 있으며 비교는 Back-End의 로직에서 확인한다.

로그인의 유지

  • 쿠키: Client에 저장되며 데이터 요청시 전달하여 사용 Ex) setcookie(useId, 김만기)
    클라이언트에 저장되는 값으로 변조가 쉽다.
  • 세션: 쿠키와 다르게 데이터의 값은 Server의 파일로 저장되며 Client는 Cookie에 SessionId를 보내어 사용자를 특정하고 해당 사용자의 정보를 확인 할 있다.

HTTP의 특징

Stateless

Http는 무상태성(Stateless)로 Server와 Client가 항시 연결되어 있는 상태가 아니다. 요청한 데이터에 대한 응답을 전달하게 되면 연결이 끊어지는 방식으로 이전에 어떠한 요청을 했는지 알 수 없다.

 

이러한 Stateless의 특성을 가지고 있기 때문에 Cookie, Session_id 혹은 JWT와 같은 로그인 한 사용자라는 것을 증명 할 수 있는 데이터를 요청시마다 전달해야한다.

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

5주차 SQL Ijection  (2) 2023.11.26
4주차 (burp suitte)  (0) 2023.11.15
2주차 (DB)  (0) 2023.11.01
0주차 (리눅스 기초 명령어)  (2) 2023.10.26
1주차(WEB, WAS, IP, NAT)  (0) 2023.10.26

현재 파일구조

webApp

|
| ㅡ index.php

| ㅡ db_connection.php

| ㅡ login.php

| ㅡ register.php


register.php

1 register.php로 POST 요청과 함께 id, pw, name, submit을 전달받으면

2. id 중복체크

3. 회원가입 처리

4. insert의 결과가 1이라면 login.php로 이동

예외처리

POST로 Submit이 왔는데 id가 공란이라면? => 아이디를 입력하세요 출력

POST로 Submit이 왔는데 name이 공란이라면? => name 입력하세요 출력

POST로 Submit이 왔는데 pw가 공란이라면? => 비밀번호를 입력하세요 출력


<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
    <meta name="generator" content="Hugo 0.104.2">
    <title>Checkout example · Bootstrap v5.2</title>

    <link rel="canonical" href="https://getbootstrap.com/docs/5.2/examples/checkout/">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">    
    <?php
      require_once 'db_connection.php';
    ?>

    <?php
        $is_id = isset($_POST['id']) && $_POST['id'];
        $is_name = isset($_POST['name']) && $_POST['name'];
        $is_pw = isset($_POST['pw']) && $_POST['pw'];
        $is_submit = isset($_POST['submit']);
        // echo 'name' . $is_name;
        /* 
        echo 'name' . ($is_submit && $is_name != 1);
        echo 'id' . $is_id;
        echo 'pw' . $is_pw;
        echo 'sub' . $is_submit;
        */
        if ($is_name && $is_id && $is_pw && $is_submit) {
          $idCount = idCount($_POST['id']);
          // echo 'idcount : ' . $idCount;

          if($idCount < 1) {
            $result = regist($_POST['id'], $_POST['name'], $_POST['pw']);
            if ($result) {
              echo "<script>alert('회원가입 완료.');
              </script>";
              // location.href='주소'
              exit;
            }
          } 
        }
    ?>

<link href="../assets/dist/css/bootstrap.min.css" rel="stylesheet">

    <style>
      .bd-placeholder-img {
        font-size: 1.125rem;
        text-anchor: middle;
        -webkit-user-select: none;
        -moz-user-select: none;
        user-select: none;
      }

      @media (min-width: 768px) {
        .bd-placeholder-img-lg {
          font-size: 3.5rem;
        }
      }

      .b-example-divider {
        height: 3rem;
        background-color: rgba(0, 0, 0, .1);
        border: solid rgba(0, 0, 0, .15);
        border-width: 1px 0;
        box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
      }

      .b-example-vr {
        flex-shrink: 0;
        width: 1.5rem;
        height: 100vh;
      }

      .bi {
        vertical-align: -.125em;
        fill: currentColor;
      }

      .nav-scroller {
        position: relative;
        z-index: 2;
        height: 2.75rem;
        overflow-y: hidden;
      }

      .nav-scroller .nav {
        display: flex;
        flex-wrap: nowrap;
        padding-bottom: 1rem;
        margin-top: -1px;
        overflow-x: auto;
        text-align: center;
        white-space: nowrap;
        -webkit-overflow-scrolling: touch;
      }
    </style>


    <!-- Custom styles for this template -->
    <link href="form-validation.css" rel="stylesheet">
  </head>
  <body class="bg-light">

<div class="container">
  <main>
    <div class="py-5 text-center">
      <img class="d-block mx-auto mb-4" src="./assets/images/normaltic_logo.png" alt="" width="72" height="57">
      <h2>회원가입</h2>
      <!-- <p class="lead">하기의 항목을 기입해주세요.</p> -->
    </div>

    <div class="row g-5">

      <div class="">
        <!-- <h4 class="mb-3">Billing address</h4> -->
        <form class="needs-validation" novalidate method="POST">
          <div class="row g-3">

            <div class="">
              <label for="아이디" class="form-label">아이디</label>
              <input type="text" value=
                <?php
                  if (isset($_POST['id'])){
                    echo '"' . $_POST['id'] . '"';
                  } else {
                    echo '""';
                  }
                ?>
              class="form-control" name="id" placeholder="아이디" required>
              <div class="">
                <?php
                    if ($is_submit && $is_id != 1) {
                        echo '아이디를 입력해주세요';
                    } elseif ($is_submit && $idCount > 0 ){
                      echo '이미 존재하는 id 입니다';
                    }
                ?>
              </div>
            </div>

            <div class="">
              <label for="이름" class="form-label">이름</label>
              <input type="text" value=
              <?php
                if(isset($_POST['name'])) {
                  echo '"' . $_POST['name'] . '"';
                } else {
                  echo '""';
                }
                ?>
              name="name" class="form-control" id="username" placeholder="이름" required>
              <div class="">
                <?php
                    if ($is_submit && $is_name != 1) {
                        echo '이름을 입력해주세요';
                    }
                ?>
              </div>
            </div>

            <div class="">
              <label for="비밀번호" class="form-label">비밀번호</label>
              <input type="password" name="pw" class="form-control" id="username" placeholder="비밀번호" required>
              <div class="">
                <?php
                        if ($is_submit && $is_pw != 1) {
                            echo '비밀번호를 입력해주세요';
                        }
                    ?>
              </div>
            </div>

            <input type=text vlaue="submit" style="display:none;" name="submit"/>

          <button class="w-100 btn btn-primary btn-lg" type="submit">회원가입</button>
        </form>
      </div>
    </div>
  </main>

  <footer class="my-5 pt-5 text-muted text-center text-small">
    <p class="mb-1">&copy; 2017–2022 Company Name</p>
    <ul class="list-inline">
      <li class="list-inline-item"><a href="#">Privacy</a></li>
      <li class="list-inline-item"><a href="#">Terms</a></li>
      <li class="list-inline-item"><a href="#">Support</a></li>
    </ul>
  </footer>
</div>


    <script src="../assets/dist/js/bootstrap.bundle.min.js"></script>

      <script src="form-validation.js"></script>
  </body>
</html>

db_connection.php

<?php
    ini_set('display_errors', 1);
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');

    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);

    function idCount($id) {
        global $db_conn;

        $sql = "select count(id) as count from user where id ='" . $id . "'";
        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);
        return $row['count'];
    }


    function regist($id, $name, $pw) {
        global $db_conn;
        $sql = "insert into user (idx, id, name, pw) value ( null, '"
        . $id . "', '" . $name . "', '" . $pw . "')";

        return mysqli_query($db_conn, $sql);
        // return $sql;
    }

    function login($id, $pw) {
        global $db_conn;
        $sql = "select count(id) as count from user where id = '" . $id . "' and pw='" . $pw . "'";

        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);
        return $row['count'];
    }
?>

결과


로그인 로직 구조

1. index.php($_session['id'] 없음) ===== redirection=====> login.php(GET)

2. login = POST => login

3. login.php로 POST 요청과 함께 id, pw, submit을 전달받으면

4. 로그인 처리 후 $_session['id'] 저장 =====redicrct===> index.php

예외처리

POST로 Submit이 왔는데 id가 공란이라면? => 아이디를 입력하세요 출력

POST로 Submit이 왔는데 pw가 공란이라면? => 비밀번호를 입력하세요 출력

POST로 Submit이 존재하고 pw가 존재하고 id가 존재하지만 DB 조회결과 count가 0 이라면 => '아이디 비밀번호를 확인하세요'

`

login.php


<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="">
    <meta name="author" content="Mark Otto, Jacob Thornton, and Bootstrap contributors">
    <meta name="generator" content="Hugo 0.104.2">
    <title>Checkout example · Bootstrap v5.2</title>

    <link rel="canonical" href="https://getbootstrap.com/docs/5.2/examples/checkout/">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">    
    <?php
      require_once 'db_connection.php';
    ?>

    <?php
        $is_id = isset($_POST['id']) && $_POST['id'];
        $is_name = isset($_POST['name']) && $_POST['name'];
        $is_pw = isset($_POST['pw']) && $_POST['pw'];
        $is_submit = isset($_POST['submit']);
        // echo 'name' . $is_name;
        /* 
        echo 'name' . ($is_submit && $is_name != 1);
        echo 'id' . $is_id;
        echo 'pw' . $is_pw;
        echo 'sub' . $is_submit;
        */
        if ($is_name && $is_id && $is_pw && $is_submit) {
          $idCount = idCount($_POST['id']);
          // echo 'idcount : ' . $idCount;

          if($idCount < 1) {
            $result = regist($_POST['id'], $_POST['name'], $_POST['pw']);
            if ($result) {
              echo "<script>alert('회원가입 완료.');
               location.href='login.php'
              </script>";
              exit;
            }
          } 
        }
    ?>

<link href="../assets/dist/css/bootstrap.min.css" rel="stylesheet">

    <style>
      .bd-placeholder-img {
        font-size: 1.125rem;
        text-anchor: middle;
        -webkit-user-select: none;
        -moz-user-select: none;
        user-select: none;
      }

      @media (min-width: 768px) {
        .bd-placeholder-img-lg {
          font-size: 3.5rem;
        }
      }

      .b-example-divider {
        height: 3rem;
        background-color: rgba(0, 0, 0, .1);
        border: solid rgba(0, 0, 0, .15);
        border-width: 1px 0;
        box-shadow: inset 0 .5em 1.5em rgba(0, 0, 0, .1), inset 0 .125em .5em rgba(0, 0, 0, .15);
      }

      .b-example-vr {
        flex-shrink: 0;
        width: 1.5rem;
        height: 100vh;
      }

      .bi {
        vertical-align: -.125em;
        fill: currentColor;
      }

      .nav-scroller {
        position: relative;
        z-index: 2;
        height: 2.75rem;
        overflow-y: hidden;
      }

      .nav-scroller .nav {
        display: flex;
        flex-wrap: nowrap;
        padding-bottom: 1rem;
        margin-top: -1px;
        overflow-x: auto;
        text-align: center;
        white-space: nowrap;
        -webkit-overflow-scrolling: touch;
      }
    </style>


    <!-- Custom styles for this template -->
    <link href="form-validation.css" rel="stylesheet">
  </head>
  <body class="bg-light">

<div class="container">
  <main>
    <div class="py-5 text-center">
      <img class="d-block mx-auto mb-4" src="./assets/images/normaltic_logo.png" alt="" width="72" height="57">
      <h2>회원가입</h2>
      <!-- <p class="lead">하기의 항목을 기입해주세요.</p> -->
    </div>

    <div class="row g-5">

      <div class="">
        <!-- <h4 class="mb-3">Billing address</h4> -->
        <form class="needs-validation" novalidate method="POST">
          <div class="row g-3">

            <div class="">
              <label for="아이디" class="form-label">아이디</label>
              <input type="text" value=
                <?php
                  if (isset($_POST['id'])){
                    echo '"' . $_POST['id'] . '"';
                  } else {
                    echo '""';
                  }
                ?>
              class="form-control" name="id" placeholder="아이디" required>
              <div class="">
                <?php
                    if ($is_submit && $is_id != 1) {
                        echo '아이디를 입력해주세요';
                    } elseif ($is_submit && isset($idCount) && $idCount > 0 ){
                      echo '이미 존재하는 id 입니다';
                    }
                ?>
              </div>
            </div>

            <div class="">
              <label for="이름" class="form-label">이름</label>
              <input type="text" value=
              <?php
                if(isset($_POST['name'])) {
                  echo '"' . $_POST['name'] . '"';
                } else {
                  echo '""';
                }
                ?>
              name="name" class="form-control" id="username" placeholder="이름" required>
              <div class="">
                <?php
                    if ($is_submit && $is_name != 1) {
                        echo '이름을 입력해주세요';
                    }
                ?>
              </div>
            </div>

            <div class="">
              <label for="비밀번호" class="form-label">비밀번호</label>
              <input type="password" name="pw" class="form-control" id="username" placeholder="비밀번호" required>
              <div class="">
                <?php
                        if ($is_submit && $is_pw != 1) {
                            echo '비밀번호를 입력해주세요';
                        }
                    ?>
              </div>
            </div>

            <input type=text vlaue="submit" style="display:none;" name="submit"/>

          <button class="w-100 btn btn-primary btn-lg" type="submit">회원가입</button>
        </form>
      </div>
    </div>
  </main>

  <footer class="my-5 pt-5 text-muted text-center text-small">
    <p class="mb-1">&copy; 2017–2022 Company Name</p>
    <ul class="list-inline">
      <li class="list-inline-item"><a href="#">Privacy</a></li>
      <li class="list-inline-item"><a href="#">Terms</a></li>
      <li class="list-inline-item"><a href="#">Support</a></li>
    </ul>
  </footer>
</div>


    <script src="../assets/dist/js/bootstrap.bundle.min.js"></script>

      <script src="form-validation.js"></script>
  </body>
</html>

index.php

<?php
  ini_set('display_errors', 1);
  session_start();

  echo 'aaa: ' . session_id();
  if(!$_SESSION['id']) {
      header('location:login.php');
      eixt;
  }
  echo '<br>';
  echo $_SESSION['id'] . 'is login';

?>

 


 

결과

'웹 해킹 코스 > 과제' 카테고리의 다른 글

3-2 JWT 토큰이란?  (3) 2023.11.12
3-1(로그인 케이스)  (0) 2023.11.09
2-1 php와 DB연결  (0) 2023.11.02
1-3 CSS를 사용하여 로그인 페이지 꾸미기  (0) 2023.10.29
1-2 WAS POST방식 데이터 전달  (0) 2023.10.27

+ Recent posts