U E D R , A S I H C RSS

ZP Board/Authentication By Session

Session 을 이용한 인증.

회원 인증이란?

회원 인증이란 회원에게 부여된 고유의 아이디와 패스워드를 통해 회원임을 확인하고, 확인된 회원에 한에서 웹 사이트의 회원 전용 기능을 사용할 수 있도록 하는 것.

Session 이란

Session은 Cookie가 클라이언트 측에서 정보를 관리하는것과는 달리, 서버측에서 정보를 관리합니다. Session과 Cookie가 왜 나타났는지를 알려면 그 근원인 HTTP 프로토콜에 대한 약간의 이해가 필요합니다.

HTTP 프로토콜은 stateless 프로토콜입니다. connectionless 프로토콜이라고도 합니다. 예를 들어, 웹브라우저를 통해 제로페이지에 접속한다고 봅시다. 클라이언트 입장에서는 자기 자신이 연속된 요청(게시물 보기나, 위키 사용등)을 보내는것을 알지만, 서버 입장에서는 매번 온 요청이 누구로부터 온 것인지를 알 방법이 없습니다. 왜냐하면 HTTP 프로토콜의 태생이 연결지향적이 아니고, 상태를 알 수 없기 때문입니다.

그래서

클라이언트와 서버간에 지속적인 유대관계를 맺고 싶을때 사용하는 방법으로 Cookie와 Session이 등장하게 되었습니다. Cookie에 대한 이야기는 논외로 하고, Session을 살펴보면, 이는 흔히 세션아이디 또는 세션키라 부르는(이하 세션아이디로 통일) 값을 쿠키에 설정해놓고, 클라이언트의 요청시 쿠키에서 세션아이디를 가져와서 내부적인 검토과정을 거치고, 이에따라 유효한 요청 또는 무효한 요청을 외치게(인증하게)됩니다.

서버에서는 이 세션아이디를 바탕으로 인증 작업을 하기만 하면 되니, 정보를 얻는 방법으로 데이터베이스를 사용하건 파일시스템을 사용하건 그 이용에 제한을 가하지 않습니다.

Session 을 이용한 인증

사용자가 로그인을 한 후에, 세션아이디를 생성해서 세션값을 설정합니다. 이를 통해 클라이언트(ie. 웹브라우져)가 요청을 할때 세션아이디를 얻어오고, 서버측에서는 인증을 하게 됩니다.

예를들어, 3분 46초동안 아무런 사용자의 요청이 없을때 자동으로 로그아웃처리되는 서비스를 가정하고 다음의 시나리오를 봅시다.

  1. 처음 사용자가 로그인을 합니다. 이때 세션 아이디를 생성해서 저장하겠죠? 데이터베이스를 이용한다고 가정하고, 생성한 세션아이디를 키 값으로 해서 부가적인 정보를 기록합니다. 여기서는 현재 요청이 온 시각을 기록하면 되겠군요.
  2. 사용자가 '김돈규의 3분 45초간의 고백'을 듣고 재빨리 다시 서버로 요청을 보냅니다.
  3. 서버가 세션아이디를 통해 이전 요청 시각과의 차이를 구해보니 1초 차이로 유효한 서비스 요청임을 부르짖습니다. 다시 현재 시각을 기록합니다.
  4. 이번엔 사용자가 화장실을 갑니다. 변비였습니다. 5분후에 돌아와서 서버로 요청을 보내지만, 이미 때는 늦었습니다. 서버가 해당 요청에 대해 무효를 선언하고, 로그인 화면을 보여줍니다.

이 예는 세션이 사용되는 기능에 초점을 맞춰 가장 단순한 경우를 이야기 한 것입니다. 실제로는 고려해야 할 부분이 더 있겠죠?

여기서 잠깐

Q. 브라우져를 닫으면 자동으로 로그아웃되는거 아닌가요?
A. maybe or maybe not. 일반적인 경우, 세션에서 사용되는 쿠키는 브라우져를 닫으면서 보통 삭제되게 되어있으므로 그렇다고 볼 수도 있지만, 엄밀히 이야기해서, 로그아웃처리가 되는것은 아닙니다. 해당 세션키를 통해 다시 요청한다면, 서비스를 받을 수 있습니다. 이 모든 일은 HTTP 프로토콜 특성상 브라우져를 닫는 등의 행위가 오프라인에서 이루어지는것이기 때문입니다. (배틀넷을 하다가 랜선을 뽑으면 디스커넥이 되지만, 웹서핑도중 랜선을 뽑는건 어떠한 영양도 미치지 않는것과 같습니다.)

로그인 하기

다음은 로그인을 하는 예제이다.
그러면 아래의 예제가 원하는 바를 이룰 수 있을까요? 아니라면, 어떻게 바뀌어야 할까요.
이 예제는 브라우져를 닫는것만으로 로그아웃이 안될수도 있고.. 그걸 고쳐야 한다는 건가요? --상규
Thread로 Go Go :)

example.html
~cpp 
<?php
session_start();   // Session 을 사용하기 위해서는 반드시 맨 처음에 이 함수를 호출해주어야 한다.
?>
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
// Auth 라는 Session 변수가 없다면 인증이 안된 경우 이므로...
if(!isset($_SESSION[Auth]))
{
?>

이곳에 회원 인증이 되지 않은 경우에 보여줘야 할 것을 넣는다. (회원 인증 폼 등...)

<?php
}
// Auth 라는 Session 변수가 있다면 인증이 된 경우 이므로...
else
{
?>

이곳에 회원 인증이 된 경우에 보여줘야 할 것을 넣는다. (로그 아웃 폼, 회원 전용 기능 등...)

<?php
}
?>
</body>
</html>

login.php - 회원 인증 폼에서 ACTION 속성으로 사용
~cpp 
<?php

이곳에서 회원 DB 를 검색하여 회원 인증 폼으로부터 받은 아이디와 패스워드를 확인한다.

if(회원이 맞는 경우)
{
     $_SESSION[Auth] = "OK";     // Auth 라는 Session 변수를 만들어 준다.
}
?>
<script language = "JavaScript">window.location.replace("example.html");</script>

로그아웃 하기

다음은 로그아웃을 하는 예제이다.

logout.php - 로그 아웃 폼에서 ACTION 속성으로 사용
~cpp 
<?php
unset($_SESSION[Auth]);     // Auth 라는 Session 변수를 제거한다.
?>
<script language = "JavaScript">window.location.replace("example.html");</script>

Thread

  • Cookie와 Session의 차이를 이해했나요? 왜 Cookie를 놔두고 Session을 사용하려고 하는것이지요?
    • 보안상 Session이 더 좋다는 소리를 들어서요 --상규

  • 어떤점에 있어서 보안상 Session이 더 좋은것일까요?
    • Cookie는 클라이언트에 있어서 조작이 가능할 수 있지만 Session은 서버에 있어서 조작하는게 힘들다고 들었습니다. --상규

  • 맞습니다. 현재 예제에서 세션에 기록하는 값은 어떤 값인가요? 어떤식으로 인증이 가능하죠? 만약 클라이언트측에서 값을 조작한다면 어떻게 조작여부를 알아낼 수 있나요?
    • 어라.. 세션도 조작이 가능한가요? - 재니
      쿠키값을 조작할 수 있습니까? 세션을 어떤식으로 생성하고 사용할 수 있는지에대해 살펴보기바랍니다

  • 그냥 뭐가 문제인지 말을 해주세요. 그리고 어떻게 고치면 되는지. --상규
    문제 자체가 중요한가요? 어떤게 문제이고, 왜 문제가 되는지, 문제가 왜 문제가되는아는 과정이 중요하다고 생각해서 이런식의 문답법을 의도하게 됬습니다. 단순히 문/답을 열거하는것보다 문제를 발견하는 과정이 중요하게 생각되어 이렇게 했는데, 받아들이는 입장에서는 그게 아니었나 보군요. 다시한번 묻겠습니다. 그냥 문제와 답을 원하는지 답을 달아주기 바랍니다. --sun

  • 질문들이 조금 이해가 안돼서요... 그럼 세션과 쿠키를 같이 사용하면 생각하시는 문제가 해결이 될까요? 쿠키의 만료 기간을 주지 않으면 브라우져를 닫으면 없어지는걸로 알고 있는데요 처음에 쿠키를 확인해 없다면 세션이 남아있더라도 지워버리는 방법을 사용하면 문제가 해결 될까요? --상규

아.. DNS가 죽어서 별 생각없이 안들어오다 답변이 늦었군요. :)

  • 쿠키의 만료 기간을 주지 않으면 브라우져를 닫으면 없어지는걸로 알고 있는데요
    맞습니다.
  • 처음에 쿠키를 확인해 없다면 세션이 남아있더라도 지워버리는 방법을 사용하면 문제가 해결 될까요?
    잘못 이해하고 있습니다. 세션역시 보통은 쿠키를 사용합니다. 쿠키에 기록된 세션값을 가져와서 서버측에서 인증을 하니까요.

좀 더 직접적으로 이야기 하기전에 한번 더 다음의 상황을 보고 추측해보기 바랍니다. (Hint: 거창한 문제점을 가지고 문제삼은게 아닙니다. 쿠키니 세션이 아닌 로직상의 문제점을 살펴보면 해답이 있습니다.)

상황

김군과 조군이 병영생활을 하고 있습니다. 이제 작전을 수행해야 하는데, 김군은 수색을 맡고 조군은 본진을 지키고 있습니다. 김군이 조군과 통신을 하기 위해서는 무전기를 사용하는데, 암호명 '로얄샬루트'를 사용하기로 합니다. 어느덧 수색을 마친 김군은 조군과의 통신을 준비합니다.

지지직 지직

김군 : 로얄샬루트

조군 : (아.. 우리편으로부터의 메세지로군)오케이 접속을 허락한다. 이제부터 인증키로 Auth라는 변수에 OK라는 값을 할당한다.


앗뿔사-_-.. 그런데 수색을 나간건 김군만이 아니었습니다. 정군이 김군과 함께 나갔던 것이었습니다.


Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:28:30
Processing time 0.0357 sec