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
댓글
댓글 쓰기