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 |
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 |