본문 바로가기

Network

network :: content-type, MIME, application/x-www-form-urlencoded

지금 프로젝트 중인데 프로젝트와 관련해서 content-type 이 무엇인지 살펴보고 가야 할 것 같아서 정리를 좀 하겠다.


http 프로토콜에서 request 나 response 메세지가 발생할 시, 그 메세지는 헤더(header)를 가지고 있다. 이 헤더는 http 트랜젝션이 동작하는 것에 대해서 기술한다. 


http header 에 대해서 살펴보는 것은 다음으로 하고, 오늘 살펴 볼 것은 http header 의 속성 중에 content-type 이라는 것이 있다. 이는 request 나 response 메세지 모두에서 해당하는 값이다. 집중적으로 살펴볼 것은 request 메세지를 보낼 때 content-type 이 어떤 값을 가져야 하는 것인가이다.


request 라는 말 자체에서도 알 수 있듯이 우리가 서버에 무언가를 요청한다는 의미이고, 이 때 서버에 뭔가를 요청할 때, 무엇을 요청할 것인지에 대한 정보 정도는 보내줘야 한다. 가령, 우리가 무언가를 검색한다고 치자. 그럼 무엇을 검색했는 지 검색어 정도는 서버에 보내줘야 한다. 


좀 더 구체적으로 예를 들어보자. 여기는 네이버 블로그이니까 네이버에서 'OECD' 에 대해서 검색한다 치면, 검색창에 OECD 라고 치고 나서 엔터키를 누르게 될 것이다. 이 때 엔터를 치면, request 메세지가 네이버 검색 서버로 넘어간다. 이 때, request 메세지에는 OECD 라는 정보를 가지고 있어야 할 것이다. 그럼 서버에서는 request 메세지 안에서 OECD 라는 값을 찾아낸 뒤에, 해당 OECD 에 해당하는 웹 페이지들을 DB 에서 검색할 것이다. 그리고 (요청한 사람에게 보여주기 위해서) 검색해서 받은 데이터들을 가지고 html 파일을 만든 뒤, 요청한 사람에게 해당 html 파일을 보내준다. 약간 곁 가지를 좀 더 치자면,  네트워크 상에서 다양한 종류의 데이터들이 전송될 수 있고, 그러므로, 각 타입에 따라 서로 다른 방식으로 전송되야 할 수도 있다. 그래서 타입마다 공통된 약속을 정해 놓고 약속에 따라 해당 데이터를 전송하게 된다. html 과 같이 하이퍼텍스트(hypertext) 문서를 보낼 때는 http 라는 프로토콜(약속 혹은 규약) 에 따라 데이터를 주고 받게 된다. (http 은 hypertext transfer protocol 의 약자이다. 우리는 http://www.naver.com 처럼 주소창에 http 라고 적혀있는 것을 많이 봤을 것이다. 이는 html (Hypertext Markup Language) 과 같은 hypertext 문서를 네트워크 상에서 전송할 때, 어떠한 방식으로 주고 받을 것인지를 정해놓은 약속 혹은 규약이다.) 


자, 그럼 진짜 본론으로 들어가서 content-type 은, (OECD 처럼) request 메세지에 포함되어야 하는 정보가 있을 때, 그 데이터 타입이 어떠해야 하는지를 나타낸다. 그런데 모든 request 메세지에 다 지정해 줄 필요가 있는 것은 아니고, request 메세지가 전송되는 방식은 여러가지가 있는데, 그 중 post 나 put 의 경우 content-type 을 지정해줘야 한다. content-type 이 가질 수 있는 값은 MIME type 의 값 들이다.


그럼 MIME type 이 뭔지 또 살펴보자. 에고 공부할게 많다. 인터넷 메디아 타입(internet media type) 이라고도 불리는 이 타입은, Multipurpose Internet Mail Extension 의 약자이다. 처음에 MIME 타입은, SMTP(인터넷 프로토콜(IP) 에서 e-mail 을 보낼 때 사용되던 프로토콜) 를 통해 e-메일을 보낼 때 사용되는 것이 지금은 다른 프로토콜에서도 확장되어 사용되고 있다. MIME 타입은 아스키코드(ASCII code) 로 기술 될 수 없는 메세지를 인코딩 하여 보내는 것을 가능하게 해준다. 즉, 영어 외의 일본어 한국어 같은 것들도 표현하여 메세지를 보낼 수 있다는 의미이다. 또한 그림, 음악, 영화, 컴퓨터 프로그램과 같은 8비트 바이너리 파일을 전자우편으로 보낼 수 있도록 한다. (참고 : http://ko.wikipedia.org/wiki/MIME#Content-Type)


MIME type 은 크게 두 부분으로 나누어 진다. type 과 subtype 으로 나누어 지는데, subtype 에 따라 추가적으로 파라미터를 가질 수 있다. 아래 예를 보자. 


<%@ page contentType="text/html; charset=utf-8" pageEncoding="euc-kr" %>


JSP 파일을 작성할 때 맨 서두에 포함되는 부분이다. 여기도 contentType 이라고 적힌 부분을 볼 수 있다. 여기서 type 에 해당하는 부분이 text, subtype 에 해당하는 부분이 html 이며, charset=utf-8 은 subtype 이 html 일 때 가질 수 있는 파라미터에 해당하는 값이다.


이제 마지막이다. request 메세지를 post 방식으로 서버에 보낼 때, MIME type 은 무엇이어야 하는가?? post 방식으로 보낸 다는 것은, request 메세지가 헤더 부분 말고도 따로 데이터를 저정할 수 있는 저장 공간이 있으며, 그러므로 보내려는 정보를 이 공간에다 저장해서 보내는 방식이 post 방식이다. 웹 브라우저에서 web form 엘리먼트로 부터 post 방식으로 데이터를 보낼 때, 표준 MIME type 이 바로 application/x-www-form-urlencoded 이다. (web form 엘리먼트라는 말은 우리가 검색창에서 검색어를 입력한 뒤, 그 입력값을 전달할 수 있는 것처럼, 사용자의 input 을 받아서 처리할 수 있도록 해주는 엘리먼트를 의미한다.)


application/x-www-form-urlencoded 방식을 선택하면, key-value 형태로 인코딩 하게 된다. 가령, 위의 예제에서 검색어가 OECE 일 경우, search=OECD 이런 식으로 인코딩 될 것이다. 만약 검색을 OECD UN 이렇게 두 단어로 했다면, search=OECD&search=UN 이렇게 인코딩 될 것이다. 참고로, 스페이스의 경우, 인코딩 되면 + 로 바뀐다. 아래는 application/x-www-form-urlencoded 타입으로 인코딩 했을 때를 보여준다.


Name: Jonathan Doe
Age: 23
Formula: a + b == 13%!

are encoded as

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21
결론을 말하겠다.

결론은!!!
웹 프로그래밍이 아니라도, 자바에서 네트워크 통신을 해서 서버에 접근해야 할 때가 있다. 아래처럼 content-type 을 지정해 주는 것을 잊지 말자! 물론 POST 방식으로 전송할 때 말이다.

URL sendUrl = new URL("https://android.apis.google.com/c2dm/send");
HttpURLConnection httpUrlCon = (HttpURLConnection)sendUrl.openConnection();
httpUrlCon.setDoOutput(true);
httpUrlCon.setUseCaches(false);
httpUrlCon.setRequestMethod("POST");
httpUrlCon.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
httpUrlCon.setRequestProperty("Content-Length", Integer.toString(sb.toString().getBytes("UTF-8").length));
httpUrlCon.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);


'Network' 카테고리의 다른 글

IPv4 :: 네트워크 클래스 종류  (0) 2011.11.25