Study

HTTP 프로토콜에서 GET 과 POST의 차이

hyeongjin's_life 2012. 11. 24. 12:33

 GET과 POST는 웹페이지에서 다른 웹페이지(클라이언트에서 서버로)로 정보를 전달하는 경우에 사용됩니다. GET과 POST 방식은 같은 기능을 하지만 상황에 따라 둘 중 하나를 사용해야 합니다. 주로 id를 넘겨서 게시판의 리스트를 가져올 땐 GET방식을 사용하고 글을 작성하는 경우엔 POST 방식을 사용합니다. 하지만 반대로 사용하더라도 크게 문제 될 것은 없기 때문에 어떤 방식을 사용하는 것이 좋을지 고민하게 된다고 합니다.

 그럼 GET방식과 POST방식의 차이점부터 보도록 하겠습니다.

1. GET 방식

- 모든 파라미터는 URL을 통해 전달된다.

- 사용자의 눈에 직접적으로 표시되기 때문에 로그인 비밀번호 등의 정보를 GET 방식으로 전달하면 문제가 발생 할 가능성이 있다.

- URL의 길이가 정해져 있어서 많은 양의 정보를 전달할 수 없다.

- URL 형식에 맞지 않는 파라미터 이름, 값은 ENCODING 해서 전달해야 한다. 그렇지 않은 경우 전달하려는 정보가 아닌 다른 정보가 전달될 수 있다.


2. POST 방식

- 전달하고자 하는 정보가 HTTP Body 에 포함되어 전달된다.

- HTTP Body에 포함되므로 웹브라우저 사용자의 눈에 직접적으로 표시되지 않는다.

- Body 에 포함되어 전달되어 길이에 제한이 없다.


 생각해 보니까 인터넷 쇼핑할 때나 학교 홈페이지 로그인 할 때 URL에 저의 아이디가 나오는 것을 본 적이 있는 것 같습니다. 그럼 그 방식은 GET 방식인가 봅니다. 그때는 집에서 사용하는 컴퓨터로 했기 때문에 URL 주소를 다른 사람이 볼 위험이 없었는데요, 하지만 제가 접속했던 URL 주소는 기록(log)되어 남아있기 때문에 ID와 비밀번호 등의 개인정보가 유출 될 가능성이 있겠다 싶네요. 참조로 표시해 놓은 다른 분들의 블로그 글에서와 마찬가지로 GET 방식은 주로 개인정보가 포함되는 것 외에 간단한 작업을 하는 경우에 사용하는 것이 좋을 것 같습니다. 

 위에 GET 방식과 POST 방식의 다른점을 설명해 놓은 것 외에 웹프로그래밍 과정에서 둘 중 어느것을 사용할 지 결정하는 중요한 개념이 있다고 하는데요, 바로 'GET은 가져오는 것이고 POST는 수행하는 것이다.' 입니다. 먼저 GET은 Select적인 성향을 가지고 있다고 합니다. 즉, 서버에서 어떤 데이터를 가져와서 보여주는 용도로 사용되고 서버의 값이나 상태 등을 바꾸진 않습니다. 게시판의 리스트나 글보기 기능 같은 것이 이에 해당한다고 합니다. 반면 POST방식은 서버의 값이나 상태를 바꾸기 위해서 사용한다고 합니다. 글쓰기를 하면 글의 내용이 Database에 저장되고 수정을 하면 Database 값이 수정되게 됩니다. 


 사람들이 웹 프로그래밍을 시작하면서 자신의 편의에 따라 GET방식과 POST방식을 사용해 왔다고 합니다. 그래서 GET방식과 POST방식에 대한 얘기가 나올때마다 대표적인 예시로 설명되는 사건이 있다고 하는데요, 이 사건은 제가 참조한 사이트 중 하나인 http://blog.outsider.ne.kr/312 에 있는 글을 인용하겠습니다.


 이 얘기를 하면 어느곳에서곤 반드시 예시로 나오는 것이 Google의 Accelerator 사건입니다.(대표적으로 예를 들게 이거밖에 없나봅니다. 항상 거론되는걸 보면...) Accelerator라는 것은 그이름대로 웹서핑의 속도를 향상시킬 목적으로 구글이 발표한 것이었습니다. 어떤 웹사이트에 갔을때 페이지에 있는 URL등을 Accelerator가 미리 모두 클릭해봐서 사용자가 해당 URL로 이동하기 전에 이미지등의 미리 받아놓을 수 있는 것들을 받아놓는 역할을 해서 웹서핑의 체감속도를 높여주는 것이 목적이었습니다. 캐시때문에 한번 방문한 사이트는 더 빨리 뜨는 것을 이용한 것이죠.

 구글러들은 위에서 언급한 GET과 POST의 개념을 확실히 이해하고 이를 당연하다고 생각하는 사람들이었을 테니 이것이 문제가 될꺼라고는 전혀 생각지 못한듯 합니다. 하지만 현실은 그렇지 않죠. 실제 많은 개발자들은 GET과 POST를 용도구분없이 혼용해서 사용했고 Delete같은 곳에도 GET방식을 편의대로 이용한 것입니다. Accelerator는 이것을 구분하지 못하니 URL만 보였다 싶으면 냅다 클릭을 해댄 것이고 사용자가 클립한 것이 아닌 Bot이 직접 URL로 접근해버리자 해당 데이터들은 Delete를 수행해버려서 메일이나 게시글이 마구 지워지는 사태가 발생하였습니다. 좋은 의도였는데 상당히 안좋은 결과가 되었죠. 우리가 모두 이걸 지켰다면 훨씬 좋은 웹 환경이 됐을 텐데요.


참조 

1. http://promisej7.tistory.com/376        하늘과 나의 IT 스토리

2. http://blog.outsider.ne.kr/312            OUTSIDER's DEV STORY