Form 통신과 json 통신의 차이점


Form 통신 특성에 초점을 맞추어 작성하였습니다.



Form 통신

HTML Form 데이터를 가공하여 웹 서버에 전달한다.


MIME-type

UUEncode에서 개선된, 인코딩 방식을 명시하는 값.

MIME은 문서, 파일 또는 바이트 집합의 성격과 형식을 나타낸다.
<RFC 6838>
다양한 미디어 타입에 대해서는 다음을 참고한다.

별도의 헤더로 존재하는 것이 아니라
content-type에 포함된다.



Content-Type

HTTP 메시지에서 Content-Type헤더는
HTTP 통신에서 미디어 데이터의 오리지널 타입(MIME type)을 알려주는 값이다.

html form에서는 enctype에 있다.

예는 아래와 같다.

Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=ExampleBoundaryString


텍스트 파일을 텍스트 파일로 읽는 데에는 문제가 없으나
문자 파일 뿐 아니라 다양한 확장자를 가진 바이너리 파일은
종단간에 ASCII 코드 텍스트를 해석하던 방식만으로는 읽을 수 없다.


바이너리 파일 -> 텍스트 파일로 인코딩
텍스트 파일 -> 바이너리 파일로 디코딩
을 위해 이 필드의 명시가 필요하다.


클라이언트에서 content-type 헤더를 명시한다면
서버로 보낼 컨텐츠의 타입을 지정하게 되고

서버로부터 돌아오는 response의 content-type 헤더에는
사용자가 받을 컨텐츠의 타입이 지정된다.

type 제한이 엄격하다면
415 에러가 리턴된다.


multipart/form-data
특히 서로 다른 content-type을 가진 html form에서(text + image)
하나의 http request body로 전송할 때 사용하며,
파일 업로드에 사용.


application/x-www-form-urlencoded
form POST 통신의 기본 content-type.
파일 업로드와 같은 로직 없이 단순한 형태의 경우 사용.

html의 데이터를 url 인코딩하여 서버로 전송한다.

kev-value쌍들로 이뤄진 데이터를 전송하며
< RFC 1738 >의 url encoding 규칙에 따라 인코딩된다.
세 문자를 한 묶음으로 인코딩하여
URL로 사용할 수 없는 문자들(한글, 예약어, 특수문자 등)을 사용할 수 있도록 변환한다.

정리하면, content-type을 application/x-www-form-urlencoded로 명시해줌으로써,
1. URL에 직접 송신할 데이터를 노출하지 않게하여 의미 혼동을 피한다.
2. HTTP request의 body에 url encoding을 거친 데이터를 넣어 안전하게 전송한다.


인코딩 프로세스로 인해 큰 데이터를 보내기엔 적절하지 않으며.
서버의 reponse에 대해 클라이언트는 page를 reload하여 데이터를 갱신한다.





in django,

django.forms.Form 모듈이 form 통신을 위한 api를 제공한다.
예를 들어, 아래와 같은 html과 코드가 대응된다.


<form action="/submit-form/" method="POST">
    {% csrf_token %}
    <input name="username" type="text" />
    <input name="password" type="password" />
    <button type="submit">Submit</button>
</form>



def submit_form(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        # Process form data...
post request의 body 컨텐츠는 url encoded되어 (name,value) 쌍 들이 생성된다.


json 통신

Content-Type

application/json
HTML 폼의 기본 포맷이 아니므로 명시가 필요하다.

애플리케이션

- 비동기 통신
- AJAX가 쓰이는 프론트엔드에서의 반응성이 높아야하는 애플리케이션
- 모바일앱
- SPA







댓글

이 블로그의 인기 게시물

실무진 면접 경험으로 정리하는 백엔드 (1) : 에듀 테크 기업 면접

노마드코더 개발자북클럽 Clean code TIL 6 : 6장. 객체와 자료구조

백엔드 개발자가 Djnago fullstack 사이드 프로젝트를하며 ( html, css, vanillaJS 그리고 JS프레임워크 )