GET과 POST 메서드란?
웹 개발을 하다 보면 브라우저에서 웹 서버로, 그리고 최종적으로 CGI 프로그램까지 정보를 전달해야 하는 상황을 자주 마주하게 됩니다. 브라우저가 이러한 정보를 웹 서버에 전달하는 대표적인 방식으로는 GET 메서드와 POST 메서드, 두 가지가 있습니다.
GET 메서드를 사용한 정보 전달
GET 메서드는 인코딩된 사용자 정보를 페이지 요청 URL 뒤에 붙여서 전송합니다. 이때 페이지 주소와 인코딩된 정보는 물음표(?) 문자로 구분되며, 형식은 다음과 같습니다.
https://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET 메서드는 브라우저에서 웹 서버로 정보를 전달하는 기본(default) 방식입니다. 전송되는 데이터는 긴 문자열 형태로 만들어지며, 브라우저의 주소 표시줄(Location Box)에 그대로 노출됩니다.
따라서 비밀번호나 기타 민감한 정보를 전송할 때는 절대 GET 메서드를 사용해서는 안 됩니다. 또한 GET 메서드에는 크기 제한이 있어 요청 문자열에 최대 1024자까지만 담을 수 있다는 점도 유의해야 합니다.
GET 방식으로 전송된 정보는 QUERY_STRING 헤더를 통해 전달되며, CGI 프로그램 내부에서는 QUERY_STRING 환경 변수를 통해 접근할 수 있습니다.
정보를 전달하는 방법은 두 가지입니다. 첫째, 키(key)와 값(value) 쌍을 URL 뒤에 단순히 연결하는 방식이고, 둘째, HTML의 <FORM> 태그를 사용하여 GET 방식으로 정보를 넘기는 방식입니다.
간단한 URL 예제 — GET 메서드
다음은 GET 메서드를 사용하여 두 개의 값을 hello_get.py 프로그램에 전달하는 간단한 URL 예시입니다.
/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI
웹 브라우저가 전달한 입력값을 처리하는 hello_get.py 스크립트는 아래와 같습니다. 여기서는 cgi 모듈을 사용하는데, 이 모듈을 활용하면 전달된 정보를 매우 쉽게 다룰 수 있습니다.
#!/usr/bin/python
# CGI 처리를 위한 모듈 임포트
import cgi, cgitb
# FieldStorage 인스턴스 생성
form = cgi.FieldStorage()
# 필드에서 데이터 가져오기
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"위 스크립트를 실행하면 다음과 같은 결과가 출력됩니다.
Hello ZARA ALI
간단한 FORM 예제 — GET 메서드
다음 예제는 HTML 폼(Form)과 제출(Submit) 버튼을 사용하여 두 개의 값을 전달합니다. 입력값의 처리에는 동일한 CGI 스크립트인 hello_get.py를 사용합니다.
<form action = "/cgi-bin/hello_get.py" method = "get"> First Name: <input type = "text" name = "first_name"> <br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form>
위 폼의 실제 출력 화면은 다음과 같습니다. 이름(First Name)과 성(Last Name)을 입력한 후 제출 버튼을 클릭하면 결과를 확인할 수 있습니다.
First Name: Last Name: Submit
POST 메서드를 사용한 정보 전달
CGI 프로그램에 정보를 전달하는 일반적으로 더 안정적인 방법은 POST 메서드입니다. POST 방식은 정보를 GET 방식과 동일하게 패키징하지만, URL의 ? 뒤에 문자열로 덧붙여 보내는 대신 별도의 메시지로 전송한다는 점이 다릅니다. 이 메시지는 표준 입력(standard input)의 형태로 CGI 스크립트에 전달됩니다.
흥미로운 점은, 앞서 살펴본 hello_get.py 스크립트가 별도의 수정 없이 GET 방식과 POST 방식을 모두 처리할 수 있다는 것입니다. cgi.FieldStorage()가 요청 방식에 관계없이 들어온 데이터를 자동으로 파싱해 주기 때문입니다.
#!/usr/bin/python
# CGI 처리를 위한 모듈 임포트
import cgi, cgitb
# FieldStorage 인스턴스 생성
form = cgi.FieldStorage()
# 필드에서 데이터 가져오기
first_name = form.getvalue('first_name')
last_name = form.getvalue('last_name')
print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"이번에도 위와 동일한 예제를 사용하여 HTML 폼과 제출 버튼으로 두 개의 값을 전달해 보겠습니다. 단, 폼의 method 속성만 post로 변경하면 되고, 입력값 처리 역시 동일한 CGI 스크립트인 hello_get.py가 담당합니다.
<form action = "/cgi-bin/hello_get.py" method = "post"> First Name: <input type = "text" name = "first_name"><br /> Last Name: <input type = "text" name = "last_name" /> <input type = "submit" value = "Submit" /> </form>
위 폼의 실제 출력 화면은 다음과 같습니다. 이름과 성을 입력한 후 제출 버튼을 누르면 결과를 확인할 수 있습니다.
First Name: Last Name: Submit
GET과 POST, 어떤 것을 선택해야 할까?
두 방식의 핵심 차이를 정리하면 다음과 같습니다.
- 데이터 전달 위치: GET은 URL 뒤에 쿼리 문자열로 데이터를 붙여 전송하고, POST는 HTTP 요청 본문(request body)에 담아 별도의 메시지로 전송합니다.
- 보안: GET은 주소창에 데이터가 그대로 노출되므로 민감한 정보 전송에 부적합합니다. POST는 URL에 노출되지 않아 상대적으로 더 안전합니다.
- 크기 제한: GET은 약 1024자의 길이 제한이 있는 반면, POST는 이러한 제약이 거의 없어 대용량 데이터 전송에 적합합니다.
- 용도: 단순 조회나 검색처럼 상태를 변경하지 않는 요청에는 GET을, 회원가입·로그인·파일 업로드 등 서버의 데이터를 변경하는 작업에는 POST를 사용하는 것이 일반적입니다.
CGI 프로그램 입장에서는 cgi.FieldStorage() 객체 하나만 사용하면 두 방식 모두 동일한 코드로 처리할 수 있으므로, 상황에 맞게 적절한 전송 방식을 선택하면 됩니다.