안규 공부방

ACTIVE SERVER PAGE > Request 내장 객체

등록일 : 2017-07-04 11:50 조회수 : 96,506

안녕하세요 안규랍니다.
 
여러분은 아마 ASP를 처음 시작하면서부터 가장 많이 사용하는 객체중 하나가 바로 이 Request 객체일 것입니다.
그만큼 많이 사용하고 익숙하다는 뜻이겠지요.
 
이 페이지에서는 Request가 어떤일을 하는지... 정리를 하고,,,,
 
어떠한 기능을 제공해 주는지를 정리해 볼까 합니다.
상당부분 알고 계시겠지만, 그래도 우리가 생각하는 정보이상을 제공해 주는 객체이니, 정리해 놓으면 개발하는데,
많은 도움이 될것 같네요..
 
Request 객체는 싸이트나 애플리케이션에 전송되는 사용자의 요청에 대한 모든 정보를 제공하는 객체입니다.
 
Request 객체는 아래 표와 같이 다섯개의 변수 컬렉션,프로퍼티,메쏘드등을 제공합니다.
   
 
Collection (컬렉션)
ClientCertificate 브라우저로부터 전송된 클라이언트의 보증서의 값
Cookies 브라우저로부터 전송이 된 쿠키값
Form 브라우저로부터 전송된 폼 요소값
QueryString http 질의 문자열의 변수값
ServerVariables http 및 환경변수값 (서버&client)



 
Property (속성)
TotalBytes 현재 요청의 본체에서 클라이언트가 보내는 바이트 수



 
Method (메소드)
BinaryRead(count) post 요청의 일부분으로 서버에 보내지는 데이터를 불러내는데 사용함.
 
  10.2.1. QueryString 컬렉션
  Form 컬렉션과 함께 가장 많이 사용하는 컬렉션 중에 하나입니다.
  사용자가 서버에 정보를 전달하는 방법은 두가지로 나눌수 있습니다.

  첫번째 방법은 <Form> 섹션을 통해 전달하는 방법이고, 두번째로는 URL끝에 질의 문자열로 직접 추가되어
  전달되어 지는 방법입니다.
     
 
		 test.html 파일
		<html>
		<body>
    			<form Action="test1.asp" METHOD="GET">
        			아이디 : <INPUT TYPE="Text" NAME="id"><br>
        			암호 : <INPUT TYPE="Text" NAME="pass"><br>
    				<INPUT TYPE="Submit" NAME="Enter" Value="확인">
    			</form>
		</body>
		</html>   		

		 test1.asp 파일
		<html>
		<body>
		    	아이디는 <%=Request.QueryString("id")%> 이구요..
    			암호 <%=Request.QueryString("pass")%> 입니다
		</body>
		</html>   		
		


위의 예제 소스를 보시면 아시겠지만 test.html 파일에서 test.asp로 페이지가 넘어갈때, 브라우져 Address 박스엔
다음처럼 보여 질것입니다.

http://localhost/test.asp?id=xxx&pass=xxxx

우리가 redirect 나 a 태그의 HREF 어트리뷰트에 표시된 URL에 질의 문자열을 덧붙여도 똑같은 결과를
얻을 수 있습니다.

위의 예제는 URL 에 질의 문자열로 직접 전달되어지는 방법을 보았구요, 이걸 보통 GET 방식이라고 합니다.
<form> 섹션의 method 어트리뷰트 값이 "GET" 이기 때문이지요.

이걸 post 로 바꾸면 QueryString 대신에 Request.Form() 이라고 고치면 된답니다.

이 질의 문자열 방법은 하나의 심각한 한계를 지니고 있는데요. http 프로토콜 사양에 의하면 URL과 같이 송신될수 있는
데이터는 대략 1000자 내외로 한정되어 있다고 합니다.
즉, 많은 데이터를 전송하게 되면 일부데이터가 잘리게 될수도 있다는 뜻입니다. 이를 보안한게 POST 메소드를 통한
데이터 전송입니다.

컬렉션은 배열과 같이 특정 값을 쉽게 빼올수 있는 특징을 가지고 있습니다.
그러나, 배열과 다른점은 Ubound 와 같은 함수를 이용해서 크가 같은 걸 가지고 올수 없습니다.

즉, For ... Next 구문으로는 컬렉션의 모든 값에 걸쳐 반복처리가 난감합니다.
이를 위해 나온 루프문이 For...Each 문입니다.

아래표는 For ... Each 문의 간단한 사용법입니다.
For...Each 사용 법
		 test.html 파일
		<html>
		<body>
    			<form Action="test1.asp" METHOD="GET">
        			아이디 : <INPUT TYPE="Text" NAME="id"><br>
        			암호 : <INPUT TYPE="Text" NAME="pass"><br>
    				<INPUT TYPE="Submit" NAME="Enter" Value="확인">
    			</form>
		</body>
		</html>   		

		 test1.asp 파일
		<html>
		<body>
			<%
				for each Item in Request.QueryString 
					response.write item &"   "&request.QueryString(Item)&"<br>"
				next
			%>		    	
		</body>
		</html>   		
		
		위의 예제에서 test1.asp 에는 Request.QueryString("name") 과 같은 형식으로 받아야 하지만, 
		어떤 변수 값이 넘어 올지 모른다고 가정해 보자. 그러면 for...Each 루프문을 이용해서 
		모든 값을 뽑아볼수 있습니다. 
		위에서 Item 은 키값을 말하는 것입니다.
		


  10.2.2. Form 컬렉션
  Form 컬렉션은 QueryString 컬렉션과 비슷하기 때문에 상세한 설명은 접기로 하겠습니다.
  FOM 메소드를 통해 전송을 시키게 되면 HTTP 헤더에 사용자의 전송데이터를 포함시키게 됩니다.
 
  여기에서 제가 다루고 싶은 부분은 <FORM> 섹션의 컨트롤 그룹을 다루는 걸 예제로
  해보도록 하겠습니다.
 
 
컨트롤 그룹 예제
		 test.html 파일
		<form action="test1.asp" method="post">
			<input type="checkbox" name="ra" value="1"> 1
			<input type="checkbox" name="ra" value="2"> 2
			<input type="checkbox" name="ra" value="3"> 3
			<input type="submit" value="Send">
		</form>
		
		 test1.asp 파일
		<html>
		<body>
		<%
		response.write "체크된 갯수:"&request("ra").count&"<br>"
	
		for i=1 to Request.form("ra").count
			response.write i&"번째 값:"&Request.Form("ra")(i)&"<br>"
		next
		%>		    	
		</body>
		</html>   		
		

위의 그림과 테이블의 소스를 보면 아시겠지만, Checkbox는 같은 개체는 Name 어트리뷰트와 서로 다른 value 값을
가지고 있습니다.

위와 같은 같은 그룹의 Form 태그가 구릅 형태로 넘어 온다면 어떤식으로 사용해야 할까여?
이런경우는 Count 프로터티를 사용하면 됩니다. 그리구, Rquest 객체는 배열과 같은 속성을 하지고 있기 때문에
인덱스를 사용할수 가 있습니다.

일단 넘어온 name 의 갯수를 알고 싶다면,
Request.form("ra").count
와 같은 count 프로퍼티를 사용하면 됩니다.
그리구, Request.Form("ra")(i) 는 ra의 i번째 value를 뽑아 올수 있는 겁니다.
아래그림은 실행화면 입니다.
 


  10.2.3. ServerVariables 컬렉션
  이름으로 봐서는 클라이언트 요청과 별 상관이 없어 보이지만, 실은 다른 컬렉션에서 보게 되는 대부분의
  정보들이 ServerVariables 컬렉션으로부터 얻어지고 있습니다.
 
  사용방법은 Request.ServerVariables("REQUEST_METHOD") 와 같은 형식으로 사용될수 있습니다.
 
  일단 Servervariables 컬렉션의 헤더에는 어떠한 것들이 있는지를 알아야 합니다. 위에서 해 보았던 For...Each 문을
  이용하여, 정보를 뽑아볼수 있습니다.
 
	for each item in Request.ServerVariables
		Response.Write item & " == " & Request.ServerVariables(item) & "<br>"
	next
	
 
  위와 같은 정식으로 헤더를 뽑아 볼수 있습니다.
아래 표는 결과 값을 보여 줍니다.
   
ALL_HTTP HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:text/html, application/xhtml+xml, */* HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_LANGUAGE:ko-KR HTTP_COOKIE:userid=idchk=Y&userid=cak0280; __distillery=7f51c0a_9abff525-912d-4827-9b98-73f3a838d013-8e63b511c-d350248338cb-0b01; ASPSESSIONIDQCSTTTQA=NMDHNNHBLAFPMFOODAOGCEAO HTTP_HOST:ankyu.entersoft.kr HTTP_REFERER:http://ankyu.entersoft.kr/Lecture/asp/main_asp.asp HTTP_USER_AGENT:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko HTTP_DNT:1
ALL_RAW Connection: Keep-Alive Accept: text/html, application/xhtml+xml, */* Accept-Encoding: gzip, deflate Accept-Language: ko-KR Cookie: userid=idchk=Y&userid=cak0280; __distillery=7f51c0a_9abff525-912d-4827-9b98-73f3a838d013-8e63b511c-d350248338cb-0b01; ASPSESSIONIDQCSTTTQA=NMDHNNHBLAFPMFOODAOGCEAO Host: ankyu.entersoft.kr Referer: http://ankyu.entersoft.kr/Lecture/asp/main_asp.asp User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko DNT: 1
APPL_MD_PATH /LM/W3SVC/11/ROOT
APPL_PHYSICAL_PATH D:\WWW\ankyu\
AUTH_PASSWORD  
AUTH_TYPE  
AUTH_USER  
CERT_COOKIE  
CERT_FLAGS  
CERT_ISSUER  
CERT_KEYSIZE  
CERT_SECRETKEYSIZE  
CERT_SERIALNUMBER  
CERT_SERVER_ISSUER  
CERT_SERVER_SUBJECT  
CERT_SUBJECT  
CONTENT_LENGTH 0
CONTENT_TYPE  
GATEWAY_INTERFACE CGI/1.1
HTTPS off
HTTPS_KEYSIZE  
HTTPS_SECRETKEYSIZE  
HTTPS_SERVER_ISSUER  
HTTPS_SERVER_SUBJECT  
INSTANCE_ID 11
INSTANCE_META_PATH /LM/W3SVC/11
LOCAL_ADDR 220.80.108.197
LOGON_USER  
PATH_INFO /lecture/ASP/10_inobj02.asp
PATH_TRANSLATED D:\WWW\ankyu\lecture\ASP\10_inobj02.asp
QUERY_STRING  
REMOTE_ADDR 106.253.252.34
REMOTE_HOST 106.253.252.34
REMOTE_USER  
REQUEST_METHOD GET
SCRIPT_NAME /lecture/ASP/10_inobj02.asp
SERVER_NAME ankyu.entersoft.kr
SERVER_PORT 80
SERVER_PORT_SECURE 0
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE Microsoft-IIS/7.0
URL /lecture/ASP/10_inobj02.asp
HTTP_CONNECTION Keep-Alive
HTTP_ACCEPT text/html, application/xhtml+xml, */*
HTTP_ACCEPT_ENCODING gzip, deflate
HTTP_ACCEPT_LANGUAGE ko-KR
HTTP_COOKIE userid=idchk=Y&userid=cak0280; __distillery=7f51c0a_9abff525-912d-4827-9b98-73f3a838d013-8e63b511c-d350248338cb-0b01; ASPSESSIONIDQCSTTTQA=NMDHNNHBLAFPMFOODAOGCEAO
HTTP_HOST ankyu.entersoft.kr
HTTP_REFERER http://ankyu.entersoft.kr/Lecture/asp/main_asp.asp
HTTP_USER_AGENT Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
HTTP_DNT 1
 
  10.2.4. Cookies  컬렉션
  QueryString , Form 컬렉션은 오직 단일의 브라우저 요청안에서만 이용이 가능합니다.
  즉, 매번 사용자가 서버로부터 파일을 요구할때마다 필요하고, 요구로부터 정보가 업데이트
  됩니다. 보다 지속적으로 데이터를 보존하고 사용하기 위해서 만든게 바로 Cookie의 개념
  입니다.
 
  쿠키의 정보를 바꾸기 위해서는 Response 객체를 이용하면 됩니다.
  Cookies 컬렉션 내의 구성원들의 리스트를 보고자 한다면 아래처럼 for..Each 을 통해
  얻어볼수 있습니다.
 
<%
for Each Item in Request.Cookies
response.write "Cookie:"&
Item &"="&Request.Cookies(Item)&"<BR>"
next
%>

 
  10.2.5. totalbytes 프로퍼티, BinaryRead(count) 메서드
  클라이언트로부터 정보를 얻어오기 위해서는 BinaryRead를 사용해야 합니다.
 
<%
bytecount=Request.TotalBytes
binRead=Request.BinaryRead(bytecount)
response.write bytecount&"<Br>"
response.write binRead
%>


위의 예제는 클라이언트가 서버에 요청한 총 바이트수(TotalBytes) 와 BinaryRead를 구하는
예제입니다. BinaryRead 를 사용하면 파일 업로드와 같은 서버로 전송되는 이진 데이터를 읽는데
사용될수 있습니다.
 

 

Request.ServerVariables("REMOTE_ADDR")  를 통해서 기본적으로 요청 클라이언트의 IP 를 얻어올 수 있다.

하지만 해당 서버가 proxy 서버를 통해서 전달이 된 경우  REMOTE_ADDR  는 proxy 서버의 IP 가 들어가게 된다.

이러한 경우 실제 IP 를 얻기 위해서는 http 헤더에 "X-Forwarded-For"  를 통해서 IP 를 얻어올 수 있다.

Request.ServerVariables("HTTP_X_FORWARDED_FOR")
 
※ 혹시 도움이 되셨다면 댓글에 한마디 남겨주세요!
작성자   비밀번호
자동글 방지     (자동글 방지 기능입니다.)
내용   댓글달기 
이메일 문의 : cak0280@nate.com  
Copyright 2000 By ENTERSOFT.KR All Rights Reserved.