요기보드3   필수기초 선택과목 요기보드 그누보드 로그인

요기보드 Ver.3


로그인

우선 우리들이 로그인을 위해 클릭했을 대 실행되는 login.php의 코드는 다음과 같아.

- login.php

<?php
include_once('./_path.php');
if (isset($_SESSION['ssuno'])) {
    // 이미 로그인 상태면
    $current_menu = '정보변경' ;
} else {
    // 로그인이 안되었으면
    $current_menu = '로그인' ;
}
include_once('menu_sub.php') ;
include_once('layout2.php');
include_once(YOGI_DIR . '/user_login.php'); // 로그인 삽입
?>
<!--- layout2 에서 열었던 div 닫기 --->
</div> <!-- col 9 -->
</div> <!-- row -->
</div> <!-- container -->
<?php
include_once('footer.php');
?>

첫 줄은 알지? 환경설정 내용을 불러 오기 위해 _path.php를 불러왔어.

▶ 세션 (Session)
다음 줄에 세션($_SESSION[ ])이 또 나왔네. 이제 세션에 대해 알아 보자구.
세션(Session)은 브라우저를 종료할 때까지 변수값을 유지하는 특수한 형태의 변수야.
그래서 이름도 ‘세션변수’라고 별도로 부르기도 해.
보통 변수나 상수는 현재 작동 중인 php 파일을 다 처리하고 나면 생명도 끝나.
그래서 각 웹페이지를 실행할 때마다 상수값을 다시 불러 오기 위해 첫 줄에 _path.php를 넣었어.

그런데 여러 페이지에 걸쳐서 변수값이 필요한 경우들이 있어.
예를 들어 로그인을 하고 나면 내 아이디를 기억하고 있어야, 글쓰기 화면에 갈 권한이 있는지 또 권한이 없는 메뉴에는 못 가게 한다든지… 같은 기능을 만들 수 있을 거야.
이때 사용하는 게 세션변수야.

세션은 일반 변수처럼 그냥 대입해서 생성하면 안 되고, 아래와 같이 세션을 사용한다는 명령을 내려 줘야 해.
session_start();

그리고 아래와 같은 형식으로 필요한 세션변수를 만드는 거야.
$_SESSION['uno'] = 123 ;
$_SESSION['uid'] = 'abc' ;
$_SESSION['uname'] = 'Tom' ;

이렇게 만들어진 세션변수는 브라우저를 종료할 때까지 살아 있어.
왜, 네이버 같은 경우 로그인한 후 네이버창을 닫아도 다시 네이버로 가면 계속 로그인 상태가 유지되는 거 봤지? 그게 바로 세션을 이용했기 때문이야.
네이버창만 닫고 브라우저를 끝내지 않았기 때문에 세션변수가 살아 있어서 그 변수에 아이디가 있기 때문에 바로 로그인 상태로 보여 주는 것이지.
세션은 브라우저를 종료하면 자동으로 없어져.
그러나 코드로 직접 세션변수를 삭제하려면 아래 명령을 내리면 돼.
session_destroy();

▶ include_once(YOGI_DIR . '/user_login.php'); // 로그인 삽입
실제로 로그인을 클릭했을 때 본문 쪽의 로그인 화면과 처리를 담당하는 파일이야.
내용을 요약해서 볼까?
- user_login.php

$error_msg = "";  // 에러메시지 초기화
//----(1) 세션변수가 없고(즉 로그아웃 상태), [로그인] 버튼을 눌러 들어 왔으면..
if (!isset($_SESSION['ssuno']) && isset($_POST['submit'])) {  
    . . . 생략 . . .
    echo '<script>location=" ' . ROOT_PATH . ' ";</script>'; // 루트로 이동
    . . . 생략 . . .
}
//----(2) 세션변수가 없으면 로그인 폼을 출력
if (empty($_SESSION['ssuno'])) {
    echo '    <p class="w3-red">' . $error_msg . '</p>';
?>
    <h1>Login</h1>
    <form class="w3-left-align" style="max-width:400px; margin:auto" method='post' action="<?php echo $_SERVER['PHP_SELF']; ?>">
        ... 생략 ...
    </form>

우선 만일 현재 로그인이 되어 있는 상태라면 $_SESSION['uno']에 값이 있는 상태인 거야.
그러므로 그런 경우에는 바로 (2)번으로 건너뛰겠지?
그리고 (2)번에서 조건으로 if (empty($_SESSION['uno']))를 만났어.
여기서 empty( )라는 함수가 다시 나왔네.
앞서도 설명했지만 isset( )은 변수 자체가 없는 것이고, empty( )는 변수의 값이 없는 거야.
변수가 없으면 당연히 변수값도 없겠지만 변수는 있는데, 변수값만 없는 경우도 있겠지?
if (empty($_SESSION['uno'])) 조건에 걸렸다는 것은 아직 제대로 로그인이 안된 상태라는 뜻이야.
이 경우에는 $error_msg 의 내용을 빨간색으로 보여줘.
로그인을 시도했는데 아이디나 비번을 제대로 입력하지 않았으면 이 자리에 올거야.
그리고 아래에 로그인 폼을 보여 주는거야.

이제 로그인 화면이 나와서 아이디/비번을 입력하고 [로그인] 버튼을 누르면 어떻게 될까?
폼을 출력하는 user_login.php 파일의 폼에서 입력한 내용을 전달할 주소가 action="<?php echo $_SERVER['PHP_SELF']; ?>"로 되어 있으니 다시 이 파일(login.php)을 실행할 거야.
그러면 결국 여기로 다시 오겠지?
그런데 이번에는 $_SESSION['uno'] 변수는 없는데, $_POST['submit'] 변수는 있으니까 (1) 번의 조건에 맞게 돼. 그러면 (1)번 아래와 같은 … 생략 … 부분의 코드들을 실행하겠지.


if (!empty($uid) && !empty($pass)) {
	// 입력한 아이디/비번과 맞는 자료가 있는지 검색
	$query = "SELECT uno, uid, uname, level, pass FROM yg_user WHERE uid = '$uid'";
	$data = mysqli_query($dbc, $query) or die('로그인 아이디 검색에러-요기1');
	if (mysqli_num_rows($data) == 1) {
		// 검색결과가 1개이면 세션변수에 넣고 메인화면으로 이동
		$row = mysqli_fetch_array($data);
		if (password_verify($pass, $row['pass'])) { // 비밀번호가 맞으면 세션에 값넣기
			$_SESSION['ssuno'] = $row['uno'];
			$_SESSION['ssuid'] = $row['uid'];
			$_SESSION['ssuname'] = $row['uname'];
			$_SESSION['sslevel'] = $row['level'];
			//-- 쿠키 사용하려면 아래 주석 해제 
			//setcookie('ckuno', $row['uno'], time() + (60 * 60 * 24 * 1));    // 만기 1일 (60초 * 60분 * 24시간 * 1일)
			//setcookie('ckuid', $row['uid'], time() + (60 * 60 * 24 * 1));
			//setcookie('ckuname', $row['uname'], time() + (60 * 60 * 24 * 1));
			//setcookie('cklevel', $row['level'], time() + (60 * 60 * 24 * 1));
			echo '<script>location=" ' . ROOT_PATH . ' ";</script>'; // 루트로 이동
		} else {
			$error_msg = '아이디/비번을 다시 점검해 보세요.';
		}
	} else {
		// 넘어온 아이디가 없으면
		$error_msg = '아이디/비번을 다시 점검해 보세요.';
	}
} else {
	// 아이디/비번을 입력하지 않았으면
	$error_msg = '아이디/비번을 입력하세요.';
}

여기서 우선 DB에 접속하고, user_login.php의 form에서 넘어온 post 변수들을 검사해.
그리고 MySQL의 SELECT 명령으로 이 아이디와 비번과 맞는 자료가 있는지 확인하고 있어.
확인되면 이 자리에서 MySQL에서 가져온 uno, uid, uname, level 값을 세션변수에 넣어.
바로 이 지점에서 세션변수의 값이 부여되는 거야.
즉, 로그인에 성공하면 그때 세션변수가 생성되는 거야.

세션변수에 값을 넣고 나면 다음 줄은…
echo '<script>location=" ' . ROOT_PATH . ' ";</script>';
이 줄은 자바스크립을 실행하는 명령이야.
html 코드에서 <scrip>~</scrip> 사이에 있는 문장은 자바스크립문이라고 설명했지?
그런데 자바스크립에서 location="주소" 형식을 사용하면 이 주소로 이동하라는 명령이거든.
즉, 위 명령은 로그인에 성공해서 세션변수에 값을 넣고 나면 루트 패스, 즉 메인화면으로 이동하라는 명령이 되는 거야.
여기서 이 user_login.php 가 끝나고 딴 곳으로 가는거야.

만일 로그인 시도에 문제가 있으면(아이디, 비번이 틀리면) $error_msg 변수에 문제점을 넣고 계속 아래로 진행해서 다시 로그인 폼화면을 출력하게 될거야.

▶ 쿠키 ( COOKIE )
세션에 대해 이야기 했으니 여기서 '쿠키' 에 대해도 알고 지나 가자구.
'세션'은 서버에 저장되는 전역변수이고, '쿠키'는 사용하는 브라우저에 저장하는 '전역변수' 야.
역할은 비슷해서 세션이나 쿠키 모두 일단 한 번 설정이 되면 PHP 파일 작동이 끝나도 변수와 대입된 값이 살아 있어. (그래서 전역변수 라고 하지.)

차이점은 세션은 브라우저를 닫으면 자동으로 없어지지만, 쿠키는 브라우저를 닫아도 설정에서 지정한 시간 만큼은 살아 있게 돼. 심지어 컴퓨터를 꺼도 살아 있어.

왜 네이버 같은 웹사이트의 로그인 화면에 [로그인 상태유지] 나 [자동로그인] 같은 옵션이 보이는 경우가 있지? 이게 쿠키가 하는 일이야.
쿠키변수를 만들 때는 setcookie() 함수를 사용해. 사용 문법은
setcookie(변수명, 변수값, 유효기간(초))
예를들어 로그인했을때 회원의 uno 를 ckuno(CooKie uno 뜻)라는 변수에 3 일 동안 살아있게 만들려면,
setcookie('ckuno', $row['uno'], time() + (60 * 60 * 24 * 1))
time()은 초까지 표시한 현재시간을 알려주는 함수야.
그러면 현재시간 + (60초 * 60분 * 24시간 * 3일) 은 정확하게 3일 뒤의 현재 시간까지 이 쿠키변수가 유효하게 될거야.
이 시간이 지나면 이 쿠키변수는 자동으로 소멸해 버려.
일일 그 유효기간 이전에 이 쿠키변수를 해제하려면 뒤의 시간을 현재 시간 보다 적게 해 주면 돼.
예를들어 아래와 같이 변수값을 null 로 하면서 시간을 현재 보다 1시간 전으로 설정하면 자동으로 없어져 버리겠지?
setcookie('ckuno' , '', time() - 3600)
이 쿠키는 지속시간을 마음대로 지정할 수 있다는 큰 장점이 있지만, 보안에 취약할 수도 있다는 큰 단점도 있어.
변수값이 내 컴퓨터 안에 저장되어 있기 때문에 누군가 내가 자리를 비운 사이 컴퓨터를 뒤져서 쿠키변수와 값을 알아 낼 수도 있어.
실제로 브라우저에서 F12를 눌러 개발자 모드에 가면 어떤 쿠키가 설정되어 있고, 값이 무엇인지 볼 수 있어.
그래서 쿠키에 비밀번호 같은 것을 저장하면 절대 안돼.
그 보다 꼭 필요하지 않으면 쿠키를 사용하지 말고 세션을 사용하는게 좋아.

'요기보드'에서는 바로 혹시나 모를 보안상의 이유 때문에 쿠키 설정과 쿠키사용 부분은 주석으로 처리해 두었어.
만일 여러분의 홈페이지에서는 쿠키가 꼭 필요하다면 주석을 해제하고 사용하면 될거야.
참고로 쿠키가 사용된 자리는 다음과 같아
  • _config.php
  • user_login.php
  • user_logout.php

휴~ 정신없지?
내가 설명한 명령들을 하나하나 다 외우려고 할 필요 없어. 지금은 우선 ‘아~ 이런 기능들이 있구나… 이런 식으로 하는구나….’ 하는 정도만 알아 둬. 그래도 충분해.
새로운 언어의 코드에 익숙해지려면 사실 딴 방법이 없어. 자꾸 봐야 해. 자꾸 보고 직접 입력하다 보면 나도 모르게 마치 우리말처럼 익숙해져.

이것으로 로그인 학습은 끝내고, 다음 로그아웃으로 가 보자구.


목차제 목조회
284
161
127
115
121
112
70
83
64
65
81
98
115
48
67
68
69
86