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.0258 sec