3 min read

HTTP 데이터 전송방식에 따른 네트워크 패킷

웹개발을 하다보니 POST에 Content-Type에 따라 어떻게 데이터를 보내는지 알고싶어 정리한글입니다.

HTTP에서는 크게 바디와 헤더 ,URL파라메타를 쓰므로 크게 나우어 GET/POST 만 있어 이것만 진행했습니다.

테스트는 POSTMAN가 피들러를 이용하였습니다.

보통 GET을 아래와 같은 패킷으로 날린다.

GET http://127.0.0.1/ HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------473645182073430103609714
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 36c34f15-0ea4-4f7e-8529-f53932debde5
Host: 127.0.0.1
accept-encoding: gzip, deflate
content-length: 0
Connection: keep-alive

HTTP에서의 가장 큰 특징이 있다면 아래와 같이 한글을 파라메타를 넘길경우 퍼센트 인코딩을 실시한다.(
https://ko.wikipedia.org/wiki/%ED%8D%BC%EC%84%BC%ED%8A%B8_%EC%9D%B8%EC%BD%94%EB%94%A9 )

구현방법은 생각보다 간단한데 그냥 영어가 아닌것들은 전부 앞에 %를 붙이고 바이너리를 붙이면 끝난다.

예로 ‘ ‘(스페이스바)인경우 아스키 코드는 20이다 이를 퍼센트 인코딩을 실행하면 %20이 된다.

GET http://127.0.0.1/?asd=%EC%95%84%EB%82%98 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: f880087b-1c30-41aa-9368-6cfce348bb70
Host: 127.0.0.1
accept-encoding: gzip, deflate
Connection: keep-alive

이게 GET의 전부이다. 하지만 POST인경우는 Content-Type에 따라 크게 달라지게 되는데 총 아래의 3가지가 있다.

application/x-www-form-urlencoded 
text/plain,application/json
multipart/form-data

하나 하나 테스트를 해보자.

먼저 form-data이다.

POST http://127.0.0.1/ HTTP/1.1
Content-Type: multipart/form-data; boundary=--------------------------430763467054564152554869
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 64a561ec-a723-4c2c-9d33-436abcc66dec
Host: 127.0.0.1
accept-encoding: gzip, deflate
content-length: 272
Connection: keep-alive

----------------------------430763467054564152554869
Content-Disposition: form-data; name="asd"

asd
----------------------------430763467054564152554869
Content-Disposition: form-data; name="asdasd"

아나
----------------------------430763467054564152554869--

파라메타가 인코딩이 안되애는 파일을 보내는 역할도 있어서 바이너리를 통으로 보내는걸 확인할수 있다.

마지막 특징으로 클라이언트에서 자동으로 헤더에 boundary을 생성해주는데 이는 여러개의 인자의 경계면을 알려주는 하나의 토큰이 된다.

그래서 데이터 사이에 —————————-430763467054564152554869–이런 데이터를 확인할수 있다.

application/x-www-form-urlencoded 인경우 파일을 보내기보다는 문자를 보내다 보니 영어가 아닌 문자를 보낼경우 body에 인코딩이 된걸 확인할수있다.

POST http://127.0.0.1/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 8a30a782-001f-4108-bf2c-92bdc9ce76f6
Host: 127.0.0.1
accept-encoding: gzip, deflate
content-length: 39
Connection: keep-alive

asd=asd&asd=%E3%85%81%E3%84%B4%E3%85%87

마지막으로 text/plain와 application/json 인데 아래를 한번보자

POST http://127.0.0.1/ HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.15.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 2fb0fa0a-ae53-4f39-bca6-8103ab899ee8
Host: 127.0.0.1
accept-encoding: gzip, deflate
content-length: 18
Connection: keep-alive

ㅁㄴㅇㅁㄴㅇ

애는 결국 텍스트를 보내는데 딴 영어가 아닌 문자에대해서는 인코딩을 안하는걸 확인할수 있다.

json도 사실사 text/plain과 동일하게 전송되는데 이때 content-type만 다르게 전송된다.

이짓을 한이유는 json으로 보내는 api코드가 많은데 이때 웹서버에서는 application/x-www-form-urlencoded같이 인코딩을 하는지 안하는지 알고싶어서 간단히 적은 글이다.