네트워크 전송 GET, POST 비교
개발을 하면서 서버에 요청을 하면서 굉장히 당연스럽게 POST, GET을 겸해서 사용해왔습니다.
GET방식과 POST방식은 도대체 무슨 차이점이 있을까요?
일단은 왜 사용하는 지에 대해서 일단 정리를 하겠습니다.
"GET, POST 방식의 request는 서버로 본인이 가지고 있는 data를 전달하기 위해서 사용합니다."
Data를 전달한다라는 본질적인 기능적 측면에서는 똑같다고 볼 수 있습니다.
그런데 세부적으로 보안, 전달형식, 전달할 수 있는 data의 량 적인 측면에서 봤을 때 차이점이 발생합니다.
이제 GET과 POST 방식이 가지고 있는 특징을 살펴보겠습니다.
*GET 방식
- 클라이언트로가 입력한 query의 이름과 값이 결합되어 스트링 형태로 서버에 전달됩니다.
- <FORM> TAG의 METHOD 속성의 값으로 GET을 입력합니다.
ex) <FORM NAME="form1" ACTION="index.jsp" METHOD="GET">
- 한번 요청시 전송 데이터 양은 주소값+파라미터로 255자(HTTP/1.1인 경우 2048자)로 제한됩니다.
- DB에 추가로 정보를 처리하지않고, 저장된 Data를 단순 요청하는 정도로 사용합니다.
- Dependancy : POST < GET
- URL에 그대로 query의 이름과 값이 같이 연결되어 표현됩니다.
ex) http://www.naver.com/news?title=하야
*POST 방식
- 클라이언트와 서버 간에 인코딩하여 서버로 전송합니다.
- 헤더를 통해 요청이 전송되는 방식입니다.
- <FORM> TAG의 METHOD 속성의 값으로 POST을 입력합니다.
ex) <FORM NAME="form1" ACTION="index.jsp" METHOD="POST">
- 한번 요청시 데이터 양은 제한이 없습니다.
- DB에 추가로 서버에서 갱신 작업을 할때, 서버에서 정보가 가공되어 응답하는 경우에 사용합니다.
- Dependancy : POST > GET
- POST 방식 : 클라이언트에서 데이터를 인코딩 -> 서버측에서 디코딩 해서 사용합니다.
- Query는 body 안에 들어가 있어서 보안에 조금 유리함이 있습니다.
다음은 참고할 만한 asp에서 어떤 method를 사용해서 uname, mail 을 전달하는 방법을 참고할 수 있습니다.
* POST 방식이 나온 이유
- GET 방식으로 넘길 수 있는 데이터의 양은 한계가 있기 때문이 있고,
- 사용자들에게 쉽게 URL path와 query를 노출되지 않게 body에 넣어서 노출되지 않게 하기 위해서 입니다.
(다만, GET, POST 둘 다 보안은 취약합니다.)
* 그리고 여기서 주목해야하는 부분은 어디에 GET과 POST를 사용하는가?
GET은 가져온다는 개념이고, POST는 수행한다는 개념으로 받아들이면 됩니다.
조금 더 자세히 사용하는 차이점에 대해서 이야기를 하자면,
GET은 Select와 비슷한 성향을 가지고 있습니다.
서버에서 어떤 데이터를 가져와서 보여줄 때 사용합니다. 즉, 서버의 어떤 값이나 내용, 상태 등을 바꾸지 않는 경우에 사용합니다.
예를 들면, 게시판에서 글의 내용에 대한 목록을 보여주는 경우나 글의 내용을 보는 경우입니다.
---
POST는 서버의 값이나 상태를 바꾸기 위해서 사용합니다.
글쓰기를 하면 글의 내용이 DB에 저장/수정시에 DB의 값이 변경되게하는 경우에 POST를 사용합니다.
예를 들면, 게시판의 글을 써서 올리거나, 수정하는 경우입니다.
---
*GET과 POST를 잘 못 사용하는 경우에 대해서는 Google "Accelerator" 사건이 있습니다.
Google은 웹페이지를 더 빠른 속도로 제공하기 위해서 현재 웹페이지에 URL로 Link가 쓰여있으면 미리 해당 페이지의 내용을 가져와서,
Link의 내용을 가져옵니다. 그래서 웹페이지를 전환하는 경우 빠르게 전환될 수 있게 합니다.
마치 한 번 방문했던 사이트에 다시 접근할 때 빠르게 기존의 내용을 불러와 빨리 보여주는 것과 같습니다.
그런데 문제는 구글러라는 구글의 개발자들이 GET, POST의 개념이 없이 개발을 시작하면서 발생했습니다.
WEB RESTful API의 CRUD의 지식에서 생각을 해보면,
GET은 Read를 호출하는 경우에 사용을 합니다. 그리고 나머지 Create, Update, Delete는 POST를 이용하는 게 맞습니다.
그런데 마음대로 혼용해서 구글에서 개발을 해서 Delete 같은 곳에도 GET을 이용해서 개발하여,
Accelerator가 웹페이지의 URL을 가져오는 경우 GET으로 당연히 가져오는 것으로 인식하였지만,
중간에 Delete를 GET으로 개발해놓은 부분과 충돌하여 링크의 메일이나 게시글이 마구 지워지는 사태가 발생했습니다.
---
허나 GET도 정말로 필요한 부분이 있습니다.
URL안에 해당 사이트가 어떻게 구성되었고, 어떤 Query를 담아서 요청하는 지가 보이는 문제로 보안에 위협이 되었습니다.
그런데 그 부분이 또 하나의 장점이 되는 경우가 있습니다. 요새 흔히 사용하는 "카카오톡의 공유하기"와 같은 기능입니다.
공유하기 기능은 URL을 보내줌으로써 공유를 하는 것인데, POST에는 URL에 보안때문에 담고 있지 않아서 공유하기가 힘듦니다.
그래서 여기서 GET의 보안적 문제점이지만 링크를 공유할 때 장점이 되는 URL에 모든 내용을 담고 있는 부분입니다.
---
마지막으로 결론은 GET과 POST 둘 다 어떤 부분에 사용을 하는 지 설계하고, 그다음에 사용을 해야한다는 것입니다.
저도 그동안 POST와 GET에 대해서 많은 헷갈림이 있었던게 사실인데요. 이 글을 작성하면서 확실히 명확해졌습니다.
이상입니다.