관리 메뉴

I LOVE EJ

끊김없는 세션만들기.. 주소창을 깔끔하게!! 본문

Web Development/APS

끊김없는 세션만들기.. 주소창을 깔끔하게!!

BeOne 2007. 10. 15. 15:31
●끊어지지 않는 세션을 만들기 위한 얄팍한(-_^;..)방법!!

가정을 잡아보도록 하자.

어느 사용자가 와글네에 접속을 시도를 했다.

누군가가 남긴 긴글을 20여분동안 열심히 읽고 있었다.

여기서 우리들이 한번 생각을 해볼문제는...

20분동안 페이지에 대한 제요청이 없게되면 끊겨 버린다는 문제가 생긴다는 것이다.

.... 고민스럽지 않을 수가 없다.

가끔 글을 쓰면서 소설을 쓰는 사람들이 있다.

와글네 같이 로그인을 해야만 글을 남길 수 있는 사용자들은 열심히 글을 쓴다. 소설(?)을 쓰다보면... 아마 20분이 넘어갈 수도 있으것이다. 물론 영특한 사용자는 미리 워드나 나모로 작성을 하고 난뒤에서 글을 카피해서 올리는 방법을 쓰겠지만, 우직스러운(-_-;) 어느 사용자들은 브라우저를 띄워둔체로.... 인생이야기면, 삶의 방향 (-,.-;..)등에 대해 진지하게 논할 수도 있을 것이라고 생각을 한다.

20여분을 쓴 글.. 저장버튼을 누르자 다음과 같은 메시지가 뜬다면...

"로그인을 하셔야 만 글을 쓸 수가 있습니다. 로그인을 하던지 아니면.. 나가도오!!!"

..... 너무나 강렬한 문체인 듯 하다... 로그인을 해야만 접속을 허용하겠다는 관리자의 강한 의도가 돋보이는 부분이다.

..음음.... 여하튼...

이러한 세션의 문제에 대해 한번쯤씩은 고민을 해보았으리라 생각을 한다.

일단은 두가지정도의 방법이 하야시의 뇌리를 스친다.

1. 로그인 처리를 하는데 있어 쿠키를 이용하자.

2. 숨김프레임을 이용해서 사용자의 눈을 속이자.

.....

이미 사용하고 계신분들도 있고 아직까지 고민스러워하시는 분들도 있으리라 생각을 한다.

오늘은 저 두가지중에서  두 번째 방법으로 처리하는 것에 한번 알아보도록 하겠다.

첫 번째 방법인 쿠키를 이용한 방법이 있다.

엄밀히 말하면 쿠키를 이용하는 방법은 세션을 이용하는 방법은 아니다.

우리가 로그인 처리를 하는 강좌부분에서 다음과 같이 처리를 했던 것을 떠올려보자.

(행여나.. 강좌를 참조하지 않으신분들은 로그인 처리부분 강좌를 다시한번 훌터보기를 권한다... 일단 이 강좌는 로그인처리강좌부분을 공부했다는 전제로 설명을 이어나가겠다.)

.................................................................

        session("u_id")=rs("u_id")

        session("u_name")=rs("u_name")

        session("u_pass")=rs("u_pass")

        session("u_email")=rs("u_email")

        session("u_home")=rs("u_home")

        session("u_count")=rs("u_count")

.................................................................

위의 부분은 로그인 처리를 하는 부분에서 현재 로그인하는 사용자의 정보를 세션에다가 담아두는 부분이다.

쿠키를 이용한다는 것은 여기서 세션에 담는 것을 세션을 쓰지 않고 쿠키에다 담는다고 보면 되겠다.

.................................................................

        response.cookies("users")("u_id")=rs("u_id")

        response.cookies("users")("u_name")=rs("u_name")

        response.cookies("users")("u_pass")=rs("u_pass")

        response.cookies("users")("u_email")=rs("u_email")

        response.cookies("users")("u_home")=rs("u_home")

        response.cookies("users")("u_count")=rs("u_count")

.................................................................

위와 같이 한다면 세션에 담는 것과 마찬가지로 똑같은 효과를 얻을 수가 있을 것이다.

오히려 세션에 담는 것 보다 더 효과적일 수가 있다.

일단 쿠키에 값을 담아두게 되면 세션처럼 "끊김"에 대해 걱정할 필요가 없다.

쿠키는 사용자가 브라우저를 닫지 않는 이상은 사라지지 않는다. 특별한 "삭제"가 일어나지 않는 이상은 한번담아둔 쿠키는 브라우저가 떠있는 동안은 계속 값을 가지고 있게 된다.

쿠키는 세션처럼 "용량"이란 것에 대해 제한을 받지 않는다.

물론 무한정 받아들인다는 말은 아니다. 전에 넷스케이프같은 경우는 쿠키의 용량제한이 없었다. 하지만 익스플로어는 용량제한이 있다.(사실 정확한 제한용량을 기억하지 못하겠다... 하야시의 기억력이 한스러울 뿐이다.. ...)

쿠키의 용량제한이 있다고 하더라도 서버쪽의 자원을(정확하게 말하면 세션도 쿠키를 쓴다는 것을 알려준다.) 쓰는 세션보다는 좀더 큰용량을 넉넉하게 사용할 수가 있다.

위와 같은 두가지 특징들 때문에 많은 사이트에서 쿠키를 많은 곳에서 이용을 한다.

예를 들어,

            로그인처리에서...

            쇼핑몰의 장바구니부분...

            광고 팝업창...

등등에서 쿠키를 쓰고 있다.

하지만 쿠키는 문제를 안고 있다. 바로 보안이 전혀 되지 않는다는 것이다.

과거(?)의 일이기는 하지만 쿠키값만 주욱 끍어 가는 해킹툴도 있었다.(지금도 있는지는 모르지만..)

클라이언트 하드디스크에 저장이 되는 관계로 쿠키는 보안에 항상 열려있는상태가 된다. 그런 이유로 하야시는 세션을 이용해서 로그인 부분을 처리하려고 한다.

궁금하다면 루트드라이:/document and settings/사용자계정/cookies 라는 폴더밑에 들어가보자. 거기에는 여러분들모르게 사용되었을 많은 쿠키들이 저장되어 있을 것이다.

두 번째 방법인 세션을 이용한 방법이 있다.

하야시는 로그인 처리를 세션을 이용해서 처리를 하고 있다.

보안에 대한 나름대로의 철학이 있음이다. 으하하!!! @#$%@#$%... .....

인정한다.. 사실은 배우기를 세션으로 처리하는 것을 배워서리..... 지버릇 X못준다는 말이 생각나는 나는 대목이다. ^__^;

일단은 "끊기지 않는 세션"이라는 우리의 원래의 주제에 대해 좀더 접근해보도록 하자.

세션이란 넘은 "안전"하다라는 전제를 일단 붙이도록 하자.

세션의 문제점은 사용자의 이어지는 페이지요청이 없는 경우 디폴트로 20분후면 모든 세션을 비워 버린다는 것이다.

어떤식이던간에 우리는 20분안에는 페이지 요청을 해주어야 만 한다.

눈치가 빠른 여러분들의 야리는 눈빛이 느껴진다.

그렇다. 다음과 같은 메타태그를 이용하게 되면 900초마다 페이지를 다시 요청할 수가 있다.

<meta http-equiv="refresh" content="900; url=./main.asp">

"그럼 주로 보는 페이지 위쪽에다가 위의 소스를 추가해주면 되는거 아닌가??"

..... 하하!!!... 단순함이 느껴지는 귀신콩볶아먹다고 체하는 소리가 아닌가 하는 하야시의 지극히 개인적인 감정이 물밀 듯하다. -_-+;

또다른 가정을 세워보자.

만약 하야시를 평소 존경해 마지 않던 전지현이 하야시를 사모하는 마음을 방명록에 남겨려 들어왔다고 치자.

사모의 글을 쓰던 전지현은 그만 북받혀....(~~.. 충분히 상상할 수 있는 부분이다..!!...... 하야시는 받아들일 수 있다. !!..~,.~..)

20분간 눈물을 흘리고 다시 쓰려고 하는 순간!!.. 그렇다!! 위의 메타태그로 인해 자동 리프레쉬가 이루어져 버렸다.

그동안 감정에 북받혀 썼던 글들은 순신간에.. 사라져 버리고...

평소, 지고지순, 청순하기만 하던.... 전지현의 광기어린 몸짓을 ... 우리는 상상해볼 수 있을 것이다.

좀더 고민스러워 지기 시작한다.

그래서 하야시는 이부분에 대해서 다음과 같은 방법으로 처리를 하고 있다.

일단은 아래의 소스를 보도록 하자.

default.asp

<html>

<head>

</head>

<frameset rows="*,0" border="0" scrolling="no">

        <frame name="main" src="main.asp" marginheight="0" marginwidth="0" scrolling="auto">

        <frame name="user" src="user.asp" marginheight="0" marginwidth="0" scrolling="no" noresize>

</frameset>

</html>

흔히들 보실수 있는 프레임 소스이다.

하지만 위에 빨간색부분에서 조금 특이한 부분을 이미 발견하신분들이 계시리라 믿는다.

(제발 프레임이 뭐냐고 묻지는 말자... 부탁이다... HTML강좌 사이트를 이용해주시길 진심으로 부탁드리는바이다.)

아래 그림과 같이 위,아래로 프레임이 짜개져 있는데..

 

밑에 프레임은 바로 사용자에게 보이지 않는 숨김프레임인 것이다.!!

하야시의 사이트는 원프레임으로 운영이 되고 있다. 위와같이 두 개의 프레임을 쓴다면 두가지 효과를 볼 수가 있다.

첫 번째는 주소표시난에 지저분한 URL이 나타나는 것을 방지할 수가 있고,

두 번째는 지금 말씀을 드릴려는 끊기지 않는 세션처리를 해줄 수가 있게 된다.

위의 그림처럼 화면에는 나타나지 않는 숨김프레임속에는 user.asp라는 파일이 숨어져 있다.

이 파일은 다음과 같은 소스를 가지고 있다.

<html>

<head>

<meta http-equiv="refresh" content="900; url=./user.asp">

</head>

</html>                        

위와같인 아무 내용도 없고 단지 900초마다 리프레쉬를 하는 메타태그가 들어 있을 뿐이다.

바로 숨어 있는 프레임속에 있는 파일이지만 이 소스는 굉장히 중요한 역할을 하게 된다.

위와같이 숨기프레임에서 900초마다 리프레쉬를 시키게 되면, 사용자는 브라우저를 끄지 않는이상은 세션이 종료될일은 없다.

위의 user.asp파일 소스가 끊길만 하면 다시 리프레쉬를 시켜주기 때문에 브라우저만 끄지 않는다면 세션이 끊길일은 없다.

게다가 전지현과 같이 하야시를 사모하는 글을 남기는 사용자들에게다 전혀 영향이 없다. 그들은 단지 자기 쓸 "사모의글"들과 "눈물의시간"을 마음것 가지면 되는 것이다. 세션을 유지시켜주는 것은 바로 위의 user.asp라는 파일이 대신해주고 있기 때문이다. 물론 사용자들은 이러한 사실을 모르고 사이트를 웹핑할 것이다.

아주 간단한 소스 한줄이지만... 많이 고민스러운 문제를 한번 해결해주고 있다.

한가지 의문이 생긴다???

900초인가???

잊지 말아야 할 것이 있다. 20분에 60초면 1200초이여야 한다고 생각하시는 분들이 계시리라 생각을 한다.

네트워크환경임을 잊어서는 안된다. 정확하게 1200초가 아니다. 세션이 유지되는 시간 20분은 서버쪽의 20분이고 위의 메타태그가 사용하는 1200초는 클라이언트쪽의 시간임을 상기해보도록 하자. 1119초를 한다고 해서 1초만에 리프레쉬를 시켜주는 것은 아니다. 항상 네트워크는 불안하기 때문에 좀더 시간적인 여유를 메타태그에게 안겨주어야 한다.

그래서 하야시는 조금 넉넉하게 900초를 주었다.  네트워크의 불안요소로 인한 delay를 어느정도 감안한 시간이라고 보면 되겠다. 어차피 유지되는 것.. 900초면 어떻고 1200초면 어떠한가!!...

어떤가 하야시의 배려깊은 마음 씀씀이 온몸뼈속 깊숙히 까지 전달이 되는가?? 하하!~!!... -_-..부끄러운 따름이다. ^___^;

----------------------------------------------------------------------------------------------------------------------

언제봐도 잼있는 하야시님의 강좌입니다.

숨김프레임을 이용해서.... 세션의 끊김이나.. 주소창의 주소를 숨길수 있는 아주 좋은 기능!!