질의 문자열의 개요
이번 절에서는 질의 문자열이 무엇인지와 인코딩 규칙, 전달 방식의 규칙 등을 알아보겠습니다.
질의 문자열이란?
웹 클라이언트에서 웹서버에 정보를 요청할 때 정해진 방식으로 데이터를 전달할 수 있으며, 이때 사용하는 문자열을 질의 문자열이라고 합니다.
대표적인 웹 클라이언트인 웹 브라우저에서 다양한 정보를 전달할 수 있도록 입력 양식을 제시할 수 있는데, 이때 사용되는 HTML 태그가 바로 <form> 입니다. <form> 태그는 웹 브라우저 화면에 버튼, 텍스트 필드, 체크 박스, 라디오 버튼과 같은 GUI 환경의 입출력 도구들을 출력하는 기능과 서버 프로그램의 URI를 설정하는 기능 등이 있습니다. <form> 태그의 기능을 알고 있어야 게시판 입력이나 회원가입, 회원인증 화면 등 사용자로부터 다양한 정보를 입력하게 하는 입력 양식을 웹 브라우저 화면에 출력할 수 있습니다.
질의 문자열 전송 규칙
질의 문자열 작업을 하려면 먼저 사용자가 데이터를 입력할 수 있는 화면을 만들어야 합니다. 또한, 입력한 자료를 서버로 전달해야 하며, 서버에서는 전달받은 문자열들을 추출하여 사용자가 요청한 서비스를 처리해야 합니다.
그런데 우선 질의 문자열 작업을 본격적으로 하기 전에 우리가 알아야 하는 특성이 있습니다. 그것은 질의 문자열들이 클라이언트에서 서버 쪽으로 전달될 때의 특성인데요. 이 특성들을 알아야 올바른 화면을 구성할 수 있고, 서버로 전달된 문자열들을 처리할 수 있습니다. 클라이언트가 입력한 데이터는 그대로 서버로 전달되는 것이 아니라, 정해진 규칙으로 인코딩(encoding)되어 전달됩니다. 이 규칙은 요청방식과 관계없이 동일하게 적용됩니다.
질의 문자열이 클라이언트 쪽에서 네트워크를 통해 서버로 전달될 때 다음과 같은 규칙이 있습니다.
1) name=value 형식으로 전달되며, 여러 개의 name=value 쌍이 있을 때는 &를 구분자로 사용한다.
ex) id=guest&name=Amy
2) 영문자, 숫자, 일부 특수문자는 그대로 전달되고, 이를 제외한 나머지 문자는 % 기호와 함께 16진수로 바뀌어 전달된다.
ex) id=guest&name=%C8%AB%B1%E6%B5%BF
전달되는 질의 문자열에 영문자, 숫자, 일부 특수문자, 즉 아스키(ASCII) 문자코드에 해당하는 문자는 그대로 서버로 전달됩니다. 그러나 이 문자를 제외한 나머지 문자는 % 기호와 함께 16진수로 변환하여 전달됩니다. 따라서 서버 쪽에서는 변환된 문자코드에 대해 적절한 복원 처리를 해줘야 문자열이 깨지지 않습니다.
3) 공백 문자는 + 기호로 변경되어 전달된다.
ex) id=guest&name=John+Smith
질의 문자열에 공백 문자가 있을 때는 + 기호로 변환되어 전달되는데요. URL에는 공백을 포함할 수 없는 특성이 있습니다. 만약에 공백이 있다면 공백이 나타나기 바로 전까지를 하나의 URL로 인식하기 때문에 이를 막기 위해 + 기호를 써줍니다.
요청방식에 따른 처리
먼저, WebContent에 member.html의 이름으로 새로운 html 파일을 생성합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Form Test</title>
</head>
<body>
<h3>회원 정보</h3>
<form action="queryTest" method="GET">
ID : <input type="text" name="id"/> <br/>
비밀번호 : <input type="password" name="pwd"/> <br/>
이름 : <input type="text" name="name"/> <br/>
취미 :
<input type="checkbox" name="hobby" value="climbing" /> 등산
<input type="checkbox" name="hobby" value="sports" /> 운동
<input type="checkbox" name="hobby" value="reading" /> 독서
<input type="checkbox" name="hobby" value="traveling" /> 여행 <br/>
성별 :
<input type="radio" name="gender" value="male" /> 남자
<input type="radio" name="gender" value="female" /> 여자 <br/>
종교 :
<select name="religion">
<option value="Christianity"> 기독교
<option value="Buddhism"> 불교
<option value="Catholicism"> 천주교
<option value="atheism"> 무교
</select> <br/>
자기소개 : <br/>
<textarea cols="30" rows="10" name="introduction"></textarea><br/>
<input type="submit" value="전송"/>
<input type="reset" value="지우기" />
</form>
</body>
</html>
GET 방식으로 처리
먼저 GET 방식으로 서비스를 요청하는 예제를 작성해보겠습니다. 앞에서 작성한 member.html 파일에서 <form> 태그의 method 속성값을 "GET"으로 지정합니다.
<form action="queryTest" method="GET">
브라우저에서 member.html을 실행한 후 데이터들을 입력 및 선택한 후 <전송> 버튼을 클릭합니다. <전송> 버튼을 클릭하면 <form> 태그의 action 속성에 지정한 프로그램이 실행됩니다. 우리는 아직 서버 프로그램을 만들지 않았으므로 "404 (Not found)" 에러를 응답받습니다.
그런데 브라우저의 주소 줄을 확인해 보면 member.html의 폼에서 입력한 데이터들이 name=value&name=value 형태로 표시된 것을 알 수 있습니다. 이것이 GET 방식으로 질의 문자열을 전송했을 때 가장 대표적인 특징입니다.
GET 방식으로 질의 문자열을 보낼 때는 데이터의 크기에 제한이 있습니다. 왜냐하면, 서버에서 인식할 수 있는 URI 길이는 제한적이기 때문입니다. GET 방식은 데이터의 길이가 255 바이트 미만이고, 외부에 노출되어도 상관없는 데이터를 전달할 때 적합한 요청방식입니다.
또한, GET 방식은 질의 문자열이 URI에 포함되어 전달되므로 질의 문자열들을 인코딩/디코딩하는 추가 작업이 없어 처리속도 면에서 빠른 장점이 있습니다.
지금까지 살펴본 GET 요청방식의 특성을 요약하면 다음과 같습니다.
- 전달되는 질의 문자열이 요청정보 헤더의 URI에 추가되어 전달된다.
- 전달되는 질의 문자열의 내용이 외부에 노출된다.
- 전달되는 질의 문자열의 길이가 제한적이다.
- 전달되는 질의 문자열의 인코딩/디코딩 작업이 필요없어서 처리속도가 빠르다.
- 전달되는 질의 문자열을 직접 URI에 추가할 수 있다.
그렇다면 GET 방식으로 요청되는 상황에 대해 알아봅시다.
- <a> 태그를 클릭하여 요청하는 경우
- 브라우저 주소 줄에 URL을 입력하여 요청하는 경우
- <form> 태그에서 method 속성을 생략하여 요청하는 경우
POST 방식으로 처리
이번에는 요청방식을 POST 방식으로 변경하여 실행해봅시다. 그래서 GET 방식으로 요청했을 때와 어떤 차이가 있으며, POST 방식의 특징은 무엇인지 알아보겠습니다.
member.html 파일에서 <form> 태그의 action 속성값을 "POST"로 지정합니다.
<form action="queryTest" method="POST">
브라우저에서 member.html을 실행한 후 데이터들을 입력하고 전송을 클릭합니다.
GET 방식과 마찬가지로 아직 서버 프로그램이 없어서 에러를 응답하지만, 여기서는 웹 브라우저의 주소 줄을 확인합시다.
GET 방식과는 달리 질의 문자열은 안보이고, 클라이언트가 서버에 요청한 서버 프로그램의 경로만 보입니다. 이것이 GET과 POST 방식의 눈에 띄는 가장 큰 차이입니다.
POST 방식은 질의 문자열이 요청정보의 몸체에 포함됩니다. 따라서 외부에 노출되지 않고 서버에 전달되며, 질의 문자열의 길이에 제한도 없습니다. 이러한 특징에 따라 클라이언트에서 보내는 데이터가 외부로 노출되면 안 되거나, 데이터 크기가 클 때는 POST 방식을 사용합니다. 그리고 POST 방식은 클라이언트 측에서 요청정보의 몸체에 전달하는 질의 문자열들을 인코딩해서 보내고, 이를 전달받은 서버 측에서는 다시 디코딩하는 추가 작업이 필요합니다.
POST 요청 방식은 다음과 같은 특징이 있습니다.
- 전달되는 질의 문자열이 요청정보의 몸체에 포함되어 전달됨.
- 전달되는 질의 문자열이 외부에 노출되지 않음.
- 전달되는 질의 문자열의 길이에 제한이 없음.
- <form> 태그를 사용해야만 요청할 수 있다.
'웹 프로그래밍 > Servlet & JSP' 카테고리의 다른 글
Servlet 한글 깨짐 오류, 한글 처리 (0) | 2021.03.11 |
---|---|
Servlet doGet(), doPost() 메소드 구현과 질의 문자열 추출 (0) | 2021.03.11 |
Servlet 요청 정보 처리 (HttpServletRequest) (0) | 2021.03.11 |
Servlet 응답 정보 처리 (HttpServletResponse, 한글 응답) (0) | 2021.03.11 |
서블릿 구현 및 실행 (web.xml, @WebServlet 설정) (3) | 2021.03.11 |
댓글