login register Sysop! about ME  
qrcode
    최초 작성일 :    2004년 02월 08일
  최종 수정일 :    2005년 02월 11일
  작성자 :    Dukyoung (김덕영)
  편집자 :    Taeyo (김 태영)
  읽음수 :    52,196

강좌 목록으로 돌아가기

필자의 잡담~

모두들 뜻깊은 구정 연휴 보내시고요. 올 한해 좋은 일만 있으시기를 바랍니다.
지난 시간에 우리는 7가지 ASP 개체 모델에 대해서 알아보았습니다.
Request, Response, Application, Session, Server, ObjectContext, ASPError
개체들이 바로 우리가 지난 시간에 만나본 친구들이었지요.

오늘은 이 개체들 중에서 Request 개체에 대해서 조금 자세히 알아보고자 합니다.
사실 이 Request 개체는 지금까지의 강좌 중에서도 알게 모르게 많이 사용되었지요.
(꽤 많이 사용했던 것 같은데... 전혀 모르시겠다고 한다면 곤란합니다. ㅜ.ㅜ)

ASP 를 공부하다 보면 좋건 싫건 가장 많이 접하게 되는 개체 중 하나인 Request 개체.
그럼 지금부터 한번 본격적으로 살펴보도록 하겠습니다.

Request 개체.. 많이 들어보긴 한 것 같은데 도무지 뭐하는 녀석인지 모르시겠다고요?
Request 개체가 하는 주요 업무는 클라이언트(사용자)가 서버로 정보를 보낸 다음..
'클라이언트(사용자) 웹 브라우저가 서버로 전달한 값을 검색' 하는 일이 되겠습니다.

여기서 중요한 것은 '전달한 값들의 검색을 누가 하는가' 인데요.
과연... '클라이언트' 일까요? '서버' 일까요? (대충 찍어도 확률은 50% 되겠습니다. ^^)

정답은 '서버' 입니다. 클라이언트가 보내준 정보를 서버측면에서 검색하는 것이지요.
혹시 잠시라도 '클라이언트' 라고 생각하셨던 분들은 밑의 설명을 자세히 읽어주시기 바랍니다.

이해를 돕기 위해 예를 하나 들어보겠습니다.
'나는 내 정보가 드러나는 게 싫으니까 내가 누군지 절대로 정보를 보내지 말아야지...'
이런 생각을 가지고 은밀한(?) 사이트에 주로 드나드는 K군이 있다고 가정해 보겠습니다.
이 분이 어느 날 제 사이트인 www.dukyoung.net 사이트에 접속을 시도했습니다.
그리고 사이트 초기 화면을 보았더니, 은밀한(?) 정보와는 거리가 있는 듯 싶어서, 아무 행동도 하지 않고 바로 브라우저를 닫아 버렸습니다. (역시 건전한 사이트!)
그리고는 '난 아무런 정보를 보낸 적이 없으니, 그 사이트에서는 내가 왔다 갔는지 알아차릴 수 없었을걸?' 이라고 생각하며 혼자 좋아 했습니다.
과연 그럴까요? 위의 내용은 모두 옳은 말일까요?

정답은 '아니다. 알 수 있다!' 입니다.
물론 제가 단지 이 정도로 K군의 아이디나 비밀번호 같은 민감한 정보를 알아낼 수는 없습니다.
하지만 잠깐의 접속으로 인해, K군이 접속했던 컴퓨터의 IP 주소와 K군이 사용한 웹 브라우저가 어떤 것인지.. 등등의 정보를 알 수 있습니다.
설령 K군이 자신의 정보 노출을 원하지 않았다고 하더라도 말이지요.

이렇듯, 서버는 단지 클라이언트의 접근을 통해서도 기본적인 몇몇 정보를 가져갈 수 있습니다.
당연한 이야기지만, 만약 K군이 제 사이트에서 아이디와 비밀번호를 입력한 후 로그인을 시도했다면 그 정보도 또한 서버에서 가져갈 수 있게 됩니다.
이렇듯 서버의 입장에서 봤을 때 '클라이언트들이 보내온 정보를 검색할 때 사용하는 개체'.
이것이 바로 Request 개체인 것입니다.

이 Request 개체에는 5개의 컬렉션과 1개의 속성, 1개의 메소드가 존재 합니다.
속성과 메소드라는 단어는 이전에 언급한 적이 있었지만.. 컬렉션이라는 단어가 조금 낯설군요.

컬렉션이라는 녀석은 예전에 배웠던 '배열' 과 상당히 유사하다고 생각하시면 됩니다.
컬렉션과 배열의 차이점이라면.. 배열은 '인덱스번호/데이터' 한 쌍을 사용하지만,
컬렉션은 '이름/데이터' 형식의 한 쌍을 사용한다는 점입니다.

컬렉션과 배열의 차이에 대해 이해하기 쉽도록 예를 들어보자면 다음과 같습니다.
배   열 : 배열이름(인덱스) = 데이터  ex) arrResult(0) = "김덕영"
컬렉션 : 컬렉션이름(이름) = 데이터  ex) Request.QueryString("name") = "김덕영"

좋습니다. 그러면 이제 모든 준비가 끝났습니다.
과연 Request 개체의 멤버에는 어떤 것들이 있는지 다음 표를 살펴 보도록 할까요?

Request 개체의 멤버들
 1. 컬렉션(Collection)
 1.1 QueryString 컬렉션
Request 개체 중에서 가장 많은 사용 빈도수를 자랑하는 컬렉션이며,
<FORM>태그 안에 있는 모든 HTML 컨트롤 요소들의 값을 저장하는 컬렉션입니다.
(이때 FORM 태그의 METHOD 는 GET 방식이어야 합니다.)
또한 URL 의 뒤에 '이름/데이터' 형식으로 전달되는 값들을 저장하는 역할도 합니다.

예를 들어 다음 URL 을 주소창에 입력했다고 가정해 보겠습니다.
http://www.dukyoung.net/test.asp?first=kim&second=dukyoung

이 경우..
Request.QueryString("first") 에는 "kim" 이라는 값이 저장되며,
Request.QueryString("second") 에는 "dukyoung" 이라는 값이 저장됩니다.
상당히 간결하고도 유용한 방법이므로 잘 기억해 두시는 것이 여러모로 좋겠습니다. ^^
 1.2 FORM 컬렉션
QueryString 과 함께 가장 많이 사용되는 FORM 컬렉션은, QueryString 과 마찬가지로
<FORM>태그 안에 있는 모든 HTML 컨트롤 요소들의 값을 저장하는 컬렉션입니다.
(하지만 FORM 태그의 METHOD 는 반드시 POST 방식이어야만 합니다.)

QueryString 컬렉션처럼 주소(URL) 뒤에 '이름/데이터' 형식으로 값을 전달하여 저장하는 방식을 사용할 수 없다는 것이 QueryString 컬렉션과의 또 하나의 차이점이 되겠네요.

Request.QueryString 과 Request.Form 컬렉션에 대해서는 이전 강좌에서 언급한 적이 있었습니다. 혹시 복습을 원하신다면 다음 링크를 클릭해 주세요. (복습할래요!)
 1.3 Cookies 컬렉션
이 컬렉션은 지난 시간에 잠깐 언급했던 '쿠키' 와 관련된 컬렉션입니다.
(먹는 쿠키가 아니라는 말씀은 이미 지난 시간에 드렸습니다만.. 쿨럭~)
웹서버는 클라이언트(사용자)들의 컴퓨터에 txt 파일 형식의 정보를 저장할 수 있습니다.
Request 개체의 Cookies 컬렉션은 이렇게 사용자 컴퓨터에 저장된 클라이언트의 정보를 읽어오는(누가? 서버가! 혼동하시면 안됩니다.) 역할을 담당합니다.

쿠키가 무엇인지에 대한 쉬운 예를 하나 들어보겠습니다.
여러분들이 어떤 사이트를 찾아 가서 로그인을 했다고 가정해 보겠습니다.
며칠 후 다시 그 사이트를 찾아갔을 때, 내 아이디가 이미 자동으로 입력되어 있는 현상을 혹시 겪어보신 분들이 있으신지요? (요즘 많은 사이트에서 이런 기능을 제공하지요.)

바로 이런 경우가 쿠키가 사용된 예입니다.
처음 사이트에 접근하여 로그인을 했을 때, 서버에서는 그 사용자의 아이디를 클라이언트(사용자) 컴퓨터에 저장합니다. 그리고 그 이후에 다시 그 사용자가 사이트에 들어오면 Request.Cookies 컬렉션을 이용하여 그 사용자의 아이디를 읽어오는 것입니다.

그렇다면 그 txt 파일은 어디에 있을까..? 살짝 궁금증이 생길만도 하겠네요.
그 저장 장소를 알고 싶으시면 일단 인터넷 익스플로러를 띄우시고요.
상단 메뉴 중 '도구 -> 인터넷 옵션 -> 설정 -> 파일 보기' 를 클릭하시면 됩니다.
혹시 어디인지 잘 모르시겠다면 다음 그림을 참고하시면 되겠습니다.


장소도 알았으니.. 모두들 같이 한 번 찾아 볼까요?
어떻습니까? 생각보다 많은가요? 만약 많다면 그만큼 많은 사이트에서 쿠키를 사용하여 여러분들의 컴퓨터에 정보를 저장한다고 생각하시면 됩니다.

자, 그럼 정리하겠습니다. 사용자의 컴퓨터에 저장된 쿠키 정보를 서버측에서 검색할 때 사용되는 컬렉션이 바로 Cookies 컬렉션이 되겠습니다.
 1.4 ServerVariables 컬렉션
오늘 강좌의 첫 부분에서 은밀한(?) 사이트를 좋아하는 K군 이야기를 잠시 했습니다.
클라이언트(사용자)의 의사와는 상관없이 서버에서는 클라이언트의 몇몇 정보들을 알아낼 수 있다는 말씀을 드렸는데요.
바로 이 때 사용되는 개체가 종합선물세트인 'ServerVariables' 컬렉션입니다.

이 컬렉션은 클라이언트(사용자)가 서버로 값을 전달할 때 자동적으로 함께 전달되는 HTTP 헤더값들과, 웹 서버 자체의 몇 가지 환경 변수 값들을 저장합니다.
무슨 말인지 잘 모르시겠다고요? 괜찮습니다. 사실 이 ServerVariables 컬렉션은 백 번 말하는 것보다 직접 한 번 보시는 것이 이해하기가 가장 쉽거든요.
그러면 아래 버튼을 클릭하셔서 이 컬렉션내의 모든 변수를 살펴 보도록 하겠습니다.


참고로 ServerVariables 컬렉션내의 모든 변수를 살펴보는 ASP 소스는 다음과 같습니다.

[servervariables.asp]

<TABLE BORDER>
<TR>
    <TD><B>Server Variable</B></TD>
    <TD><B>Value</B></TD> </TR>
<% For Each strKey In Request.ServerVariables %>
<TR>
    <TD><%=strKey %></TD>
    <TD><%=Request.ServerVariables(strKey) %> </TD>
</TR>
<% Next %>
</TABLE>

 1.5 ClientCertificate 컬렉션
가끔 어떤 사이트에 들어가보면 '인증', '보안' 어쩌구하는 사이트들을 만나실 수가 있습니다.
그 사이트들의 주소를 유심히 살펴보면 주로 'http://' 가 아닌 'https://' 로 시작하는데요.
이 사이트들은 아무나 들어오지 못하게 하기 위한 '사용자 인증 요구' 를 하게 됩니다.
이때 클라이언트의 브라우저에서는 서버로 지정된 인증 필드들을 전송하게 되는데, 이 정보들이 저장되는 콜렉션이 바로 ClientCertificate 콜렉션입니다.

무슨 말인지는 잘 모르겠지만 이름도 길고 철자도 어려운 것이.. 별로 마음에 안든다고요?
사실 이 콜렉션은 초보자들이 사용하기 힘든, 약간 전문적인 지식이 필요한 콜렉션입니다.
제가 이런 말씀을 드리는 까닭이 과연 뭘까요?
네~ 맞습니다. '따라서 이 콜렉션에 대한 설명은 생략하도록 하겠습니다.' 라는 말씀을 드리려 하는 것이지요. (알아 채셨다고요? 눈치가 참 빠르시군요! ^^)
(만약 이 콜렉션과 관련된 질문이 있으시다면 '질문과 답변' 게시판에 올려주시기 바랍니다.)
 2. 속성(Property)
 2.1 TotalBytes 속성
Request 개체의 TotalBytes 속성은 '클라이언트(사용자)에서 서버로 보낸 정보 안에 있는 바이트의 전체 개수에 대한 정보' 를 제공합니다.

하지만 일반적으로 서버에서는 '전체 요청 문자열이 총 몇개인데?' 보다는
'어떤 값들이 어떤 컬렉션으로 넘어왔는데?' 라는 질문이 더욱 중요하기 때문에..
이 속성은 ASP 페이지에서 사용되는 경우가 상당히 드문 편에 속하게 됩니다.
하지만 사용법은 상식 선에서 알아두는 것이 좋겠지요. 다음과 같습니다.

<%
    Dim intCount
    intCount = Request.TotalBytes
%>

 3. 메소드(Method)
 3.1 BinaryRead(count) 메소드
BinaryRead 메소드는 <FORM> 에서 POST 방식으로 정보를 전달할 때,
count 바이트 만큼의 데이터를 읽어들이는 역할을 합니다.
따라서, 이 메소드는 Request.Form 컬렉션과 부딪히는 경향이 있습니다.

만약 Request.Form 컬렉션을 참조했다면 BinaryRead 메소드는 사용할 수 없습니다.
또한 반대로 BinaryRead 메소드를 먼저 사용했다고 한다면, 짐작하시는 대로 Request.Form 컬렉션은 사용을 할 수 없게 됩니다.
이 메소드도 사용할 일이 많지는 않지만, 상식으로 사용 방법을 알아두시면 좋겠습니다.

<%
    Dim strData, intCount

    intCount = Request.TotalBytes
    strData = Request.BinaryRead(intCount)
%>


자, 오늘은 이렇게 Request 개체에서 사용하는 멤버들에 대해 알아보았습니다.
이중에서 가장 중요한 것들을 꼽으라면 역시 QueryStringForm 컬렉션이 될 것 같은데요.
ASP 페이지를 작성하시다보면 이 두 컬렉션을 너무나도 자주 사용해야 하므로,
조급하게 생각하지 않으셔도 자연스럽게 친해질 수 있을거라고 생각합니다.

마지막으로 컬렉션에 대한 Tip 을 하나 드리자면...
Request 개체에는 특수 기능이 있는 까닭에, 컬렉션의 이름은 모두 생략 가능합니다.
예를 들어서, Request.QueryString("count") 를 Request("count") 로 사용할 수 있으며,
마찬가지로 Request.Form("count") 도 Request("count") 로 사용 가능합니다.

자, 그럼 여기서 이 질문이 안나올 수 없겠죠?
방금의 경우처럼 Request.QueryString("count"), Request.Form("count") 에 각각 다른 값이 있는데 Request("count") 라고 사용했을 경우, 어떻게 될까요?

정답은! 'QueryString 컬렉션에 있는 값이 우선권을 가진다.' 입니다.
Request("count") 라고 했을 경우 Request 개체는 자체적인 우선 순위를 적용하여,

QueryString > Form > Cookies > ClientCertificate > ServerVariables

의 순서대로 검색을 하게 됩니다. 따라서 QueryString 안에 있는 값으로 인식하게 됩니다.

지난 강좌에서도 말씀드렸지만, Request("count") 라는 방식은 사용하기에 편할지는 몰라도
경우에 따라 값이 모호해질 수 있기 때문에, 부득이한 상황이 아니라면 반드시 Request.QueryString 처럼 컬렉션을 명시해주는 코딩 습관을 들이시는 것이 좋습니다.

자. 그러면 오늘의 강좌는 여기서 마치고요.
다음 시간에는 Request 개체의 둘도 없는 단짝, Response 개체에 대해서 알아보겠습니다.
장시간 긴 글을 읽어 주시느라 수고 많으셨습니다.
다음 시간에 뵙겠습니다. 새해 복 많이 받으세요~. ^^

authored by

  dsc7200
  2014-04-21(11:38)
캐릭 이미지
덕영님의 다음강좌는 어디서 볼 수 있을까요??
  taeyo
  2014-04-22(09:33)
캐릭 이미지
덕영님은 이번달로 IT를 은퇴하셨습니다. 쩝..
그래서 아쉽게도 앞으로 볼 수 없을 듯 합니다.


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})