본문 바로가기

old/Cyber Security

APM(Apache2, Php, Mysql) 기반 로그인 인증 웹사이트 만들기

반응형

목적

PHP에서 기본적으로 제공하는 세션을 이용하여 로그인하는 방식으로 APM(Apache2, Php, Mysql)로 로그인인증을 하는 웹싸이트를 제작합니다.

  1. 로그인 기능 구현
  2. 메인 페이지 구현
    • 로그인 되어야만 들어갈 수 있는 화면.
    • 현재 누구로 로그인 되어있는지 알려주기.
  3. 로그아웃 기능 구현
  4. 회원가입 기능 구현
    • ID 중복 검사 기능
    • ID, PWD 빈칸 검사

세션아이디는 임의로 유저 아이디를 사용합니다.

*참고:

우분투에 APM: Apache, PHP, MySQL 환경 셋팅

데이터베이스 (MySQL) 셋팅

서버이름 = "localhost"

데이터베이스 이름 = "test"

데이터베이스 User name = "root"

데이터베이스 Password= "1234"

테이블 이름 = “users”

admin 아이디= “admin”

admin 비밀번호= “admin”

steps

  • mysql 사용자로 db생성
mysqladmin -u root create test -p
  • mysql 사용자 접속
mysql -u root -p
  • root 계정 비번 설정: 이미 설정했다면 그 비밀번호 삽입.
use mysql; 
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';
  • 사용 디비 설정
use test;
  • 테이블 생성
create table users( 
	id int primary key auto_increment, 
	user_id varchar(255), 
	user_pwd varchar(255) 
);
  • 테이블에 기본 admin 계정 넣기
insert into users (user_id, user_pwd) values ('admin','admin');
  • 테이블 데이터 확인
select * from users;
  • db설정 종료
quit;
  • mysql 서버 실행
service mysql start
  • 아파치 서버도 실행
# 아파치 서버 시작 
sudo service apache2 start 
# 아파치 서버 중지 
sudo service apache2 stop 
# 아파치 서버 재시작 
sudo service apache2 restart

code

Main.php

<?php
session_start(); // 세션 시작
 
if(!isset($_SESSION['user_id'])) // 로그인되어있지 않다면
{
    header ('Location: ./login.html'); // 로그인 페이지로 이동
}
 
echo "<h2>로그인 성공</h2><br><h2>";
echo $_SESSION['user_id'];
echo " 님 안녕하세요</h2><br><br>"; // 로그인한 사용자의 이름 출력
echo "<a href=logout.php>로그아웃</a>"; // 로그아웃 링크 출력
 
?>

login.html

<html>
<head>
    <title>login page</title>
    <meta charset="utf-8">
</head>
<body>
    <form method="post" action="/login_chk.php">
        <div>
            <label for="user_id">ID </label>
            <input type="text" name="user_id"/>
        </div>
        <div>
            <label for="user_pwd">Password </label>
            <input type="text" name="user_pwd"/>
        </div>
        
        <div class="button">
            <button type="submit"> login </button>
        </div>
    </form>
    <button onclick="location.href='sign_up.html'"> sign up </button>
</body>
</html>

login_chk.php

<?php
session_start(); // 세션 시작

$id = $_POST['user_id']; // 사용자가 제출한 ID
$pw = $_POST['user_pwd']; // 사용자가 제출한 비밀번호

$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 데이터베이스 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 입력한 ID를 가진 사용자 정보를 가져옴
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);

// 사용자 정보가 존재하는 경우
if($result->num_rows == 1){
    $row = $result->fetch_array(MYSQLI_ASSOC); 
    // 입력한 비밀번호가 맞는 경우
    if($row['user_pwd'] == $pw){  
        $_SESSION['user_id'] = $id;           
        // 세션 저장 성공한 경우
        if(isset($_SESSION['user_id'])){    
            header('Location: ./Main.php');   
        }
        else{
            echo "세션 저장 실패";
        }            
    }
    // 입력한 비밀번호가 틀린 경우
    else{
        echo "잘못된 아이디 또는 비밀번호입니다.";
        header('Location: ./login.html');
    }
}
// 사용자 정보가 존재하지 않는 경우
else{
    echo "잘못된 아이디 또는 비밀번호입니다.";
    header('Location: ./login.html');
}

$conn->close(); // 데이터베이스 연결 종료
?>

sign_up.html

<html>
<head>
    <title> Sign Up </title>
    <meta charset="utf-8">
</head>
<body>
    <form action = "./sign_up.php" method="post">
        <div>
            <label for="user_id"> ID </label>
            <input type="text" name="user_id"/>
        </div>
        <div>
            <label for="user_pwd"> PW </label>
            <input type="text" name="user_pwd"/>
        </div>

        <div class="button">
            <input type="submit" value="submit">
        </div>
    </form>
</body>
</html>

sign_up.php

<?php
$id = $_POST['user_id']; // 사용자가 입력한 ID
$pw = $_POST['user_pwd']; // 사용자가 입력한 비밀번호
 
if($id==NULL || $pw==NULL) // 입력한 값이 빈칸인 경우
{
    echo "빈 칸을 모두 채워주세요";
    echo "<a href=sign_up.html>back page</a>";
    exit();
}

$servername = "localhost"; // 서버 이름
$username = "root"; // 사용자 이름
$password = "1234"; // 비밀번호
$dbname = "test"; // 데이터베이스 이름

// 데이터베이스 연결
$conn = new mysqli($servername, $username, $password, $dbname);

// 데이터베이스 연결 확인
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// 입력한 ID가 이미 존재하는 경우
$sql = "SELECT * FROM users WHERE user_id='$id'";
$result = $conn->query($sql);

if($result->num_rows == 1)
{
    echo "중복된 ID입니다.";
    echo "<a href=sign_up.html>back page</a>";
    exit();
}

// 새로운 사용자 정보를 데이터베이스에 추가
$sql = "INSERT INTO users (user_id, user_pwd) VALUES ('$id', '$pw')";
$signup = mysqli_query($conn, $sql);

// 회원가입이 성공적으로 처리된 경우
if($signup)
{
    echo "회원가입이 완료되었습니다.";
}
 
$conn->close(); // 데이터베이스 연결 종료
?>

logout.php

<?php
session_start(); // 세션 시작

$res = session_destroy(); // 모든 세션 변수 지우기

if($res)
{
    header('Location: ./Main.php'); // 로그아웃 성공 시 로그인 페이지로 이동
}
?>
반응형