본문 바로가기

[게시판] DB 연결, 로그인 세션 설정 + 로그인

1. DB 연결: connectDB.php
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function connectDB() 
{
    $host = "localhost";
    $user = "ID";
    $passwd = "PASSWORD";
    $DBName = "DATABASE_NAME";
 
    $conn = new mysqli($host$user$passwd$DBName);
 
    if($conn) { return $conn; }
    else { return 0; }
}
?>
cs
 
4~7행: 호스트 주소, 사용자의 ID, PW, 데이터베이스의 이름을 설정하고
9행: 그 값으로 PHP에서 MySQL 객체를 생성한다.
 
 
 
 
2. 로그인 세션 설정: session.php
 
1
2
3
4
5
6
<?php
    session_start();
 
    if(!isset($_SESSION["userID"])) { header("Location: ./login_form.php"); }
    else { $id = $_SESSION["userID"]; }            
?>
cs

 

2행: 세션을 초기화하는 함수. 세션을 사용하려면 먼저 세션을 초기화해야 한다.

 

4행: 만약 세션 값이 설정되어 있지 않다면(로그인 상태가 아니라면) 로그인 페이지로 이동하고,

5행: 그렇지 않다면 id에 세션 값을 저장한다.

 

 

 

 

3. 로그인 폼: login_form.php

 

내가 만든 웹 페이지는 기본적으로 모든 기능은 기능을 위한 폼(form) 페이지와 실제 기능 페이지로 구성된다.

로그인으로 예를 들면 로그인 폼(login_form.php)과 실제로 로그인 하는 페이지(login.php)로 구성된다는 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<?php
    if(isset($_SESSION["userID"])) { header("Location: ./list.php"); }
?>
<html>
<head>
    <meta charset="UTF-8" />
    <title> Login </title>
</head>
 
<body>
    <form method="POST" action="./login.php" align="center">
        <table align="center">
            <tr>      
                <td align="left"> ID </td>
                <td> <input type="text" name="id" maxlength="20" /> </td>
            </tr>
                <td> Password </td>
                <td> <input type="password" name="password" maxlength="32" /> </td>
            </tr>
            <tr>
                <td align="right" colspan="2">
                    <input type="button" name="signUp" value="회원가입" onClick="location.href='./signUp_form.php'" />
                    <input type="submit" value="로그인" /
                </td>
            </tr>
        <table>
    </form>
</body>
</html>
cs

 

3행: 세션 값이 설정되어 있다면(로그인 상태라면) 게시글 목록 페이지로 이동한다.

 

12행: 로그인은 서버에 ID와 PW를 전달하고 그 값으로 데이터를 읽어오지 않으므로 

  POST 방식으로 전달한다.

 

23행 - onClick: 회원가입 버튼 클릭 시 회원가입 페이지로 이동한다.

 

24행 - type="submit": 이 버튼을 누르면 12행에서 action 속성에 준 페이지로 이동한다.

 

 

 

4. 로그인: login.php

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<!DOCTYPE html>
<?php
    session_start();
?>
<html>
    <head>
        <meta charset="utf-8"/>
        <title> Login </title>
    </head>
 
    <body>
        <?php
            include "./connectDB.php";
 
            $conn = connectDB();    
            $inputID = $_POST["id"];
            $inputPW = $_POST["password"];
 
            $query = "SELECT id, password FROM users"
            
            $result = mysqli_query($conn$query);
            $rowsNum = mysqli_num_rows($result); 
            
            $pwHash = sha1($inputPW);            
 
            if($inputID === "" || $inputPW === "") {        
        ?>
                <script>
                    alert("빈 칸은 불가능합니다."); 
                    document.location.href='./login_form.php';
                </script>
        <?php
            } 
 
            for($i = 0$i < $rowsNum++$i) {
                $arr = mysqli_fetch_array($result, MYSQLI_ASSOC);            
                
                if((strcmp($arr["id"], $inputID== 0&& (strcmp($arr["password"], $pwHash== 0)) {
                    $isMember = true
                    $userName = $arr["name"];
                    $_SESSION["userID"= $inputID;
                    break;
                } else {
                    $isMember = false;
                }
            }
        
            if($isMember) { 
        ?>
                <script
                    alert("Welcome");
                    document.location.href='./list.php';
                </script>
            
        <?php
            } else {
        ?>
                <script>
                    alert("아이디나 비밀번호를 확인해 주세요.");
                    document.location.href='./login_form.php';
                </script>
        <?php
            }
        ?>
    </body>
</html>
cs

 

 

16, 17행: POST 방식으로 전달받은 ID와 패스워드의 입력값을 변수에 저장한다.

 

21행: 첫 번째 매개변수로 전달된 데이터베이스에서 두 번째 매개변수로 전달된 쿼리를 

  실행하고 그 결과를 반환한다.

 

22행: 21행에서의 쿼리 실행 결과의 행 수를 반환한다.

 

24행: DB에 사용자 정보를 저장할 때는 SHA-1 해시값을 저장한다. 이는 DB가 해킹당해도 

  사용자의 정보를 해석할 수 없도록 하기 위함이다.

 

26행: PHP의 == 연산자는 자료형을 일치시켜 비교하는데, 이는 취약점이 되므로 === 연산자로

  비교한다. === 연산자는 자료형을 바꾸지 않고 비교한다.

 

36행: 21행에서의 쿼리 실행 결과를 한 줄씩 읽어 배열의 형태로 반환한다. 

  두 번째 매개변수에는 다음의 세 가지 값을 전달할 수 있다. 

 

MYSQLI_ASSOC: 테이블의 속성명으로 읽어온다.

MYSQLI_NUM: 속성의 인덱스로 읽어온다.

MYSQLI_BOTH: 둘 다

 

40행: 만약 36행에서 MYSQLI_NUM을 전달했다면 seq, name, id, password의 순서이므로 

   $arr[1] 로 읽어왔어야 한다. 

 

41행: 로그인 성공 시 세션 값을 입력받은 ID로 설정한다.

 

52행: isMember의 값이 참이면 (로그인이 성공하면) 게시글 목록 페이지로 이동하고,

60행: 그렇지 않으면 다시 로그인 페이지로 이동한다.

'Programming > Web' 카테고리의 다른 글

[게시판] 게시글 수정  (0) 2019.07.17
[게시판] 게시글 작성  (0) 2019.07.16
[게시판] 회원가입  (0) 2019.07.16
[게시판] 데이터베이스 설계  (0) 2019.07.12
GET 방식과 POST 방식의 차이  (0) 2019.07.09