본문 바로가기

면접질문[CS]/알고리즘 & OS

HTTP의 GET과 POST 메서드 비교. [ 네트워크 면접 질문1 ]

들어가기 전

 

면접 때 해당 질문을 받았다. 현재 많은 내용을 습득한 결과...

 

정말 수준이 낮은 대답을 했다는 생각이 든다.

 

HTTP는 클라이언트-서버 아키텍처에서 사용되는 매우 중요한 프로토콜이다.

 

사실상 현대의 많은 비즈니스 서비스들이 웹 위에서 구동되고 있는데

 

웹 서비스의 핵심 소통수단이 바로 HTTP(하이퍼 텍스트 전송 프로토콜)이다.

 

GET, POST는 HTTP에서 가장 많이 사용되는 메서드이다. 

 

GET은 서버로부터 리소스를 가져와달라는 요청이고

 

POST는 데이터가 서버로 들어가야 함을 보내는 요청이다.

 

둘 다 HTTP 요청이지만 많은 부분에서 차이점이 존재한다.

 

HTTP의 GET과 POST 질문에 답변을 제대로 하지 못했다면...  

 

네트워크 부분에서 좋지 않은 점수를 받을 가능성이 크다. 

 

GET과 POST의 주요한 차이점에 대해서 한번 살펴보자. 


WHY

HTTP에 대해서 어느 정도 이해했는지 알 수 있는 대표적인 질문이라 생각된다.

 

어떠한 점에서 차이점을 가지고 있는가를 통해 제대로 이해하고 있는지를 살펴볼 수있다.

 

각각의 차이점에 대해서 추가적인 답변도 할 수 있고 "키워드"도 뚜렷해서 좋은 질문이라고 생각한다. 

[ 정답이 키워드 틀에서 크게 벗어나지 않는다. ]

 

전체적으로 답변을 살펴보면서 얕게 이해하고 있는지 등등도 파악할 수 있는 좋은 질문이기도 하다.

 

내가 처음 했던 대답.

 

나의 경우 2가지 특징만 언급했다.

 

둘 다 HTTP의 요청과 관련된 메서드라는 점(공통점).

 

차이점으로는 GET의 경우 자원을 요청하는 것이고 POST의 경우 자원의 상태를 변경하는 데 목적이 있다는 점.

 

그리고 GET은 멱등성을 보장하나 POST의 경우 멱등성을 보장하지 않는다고 했다.

[ 6~8개의 특징들을 더 말할 수 있는 질문이지만 나는... 2~3개만 말했다. 멱등성과 관련해서는 캐싱까지 깊게 답변할
수도 있었는데 아쉽다. ]

 

이 정도 대답은 50점도 받기 어려울 것 같다.

 


HTTP는 서버와 클라이언트 간에 데이터를 교환하는 방식이다.

 

서버(응답측)과 클라이언트(요청)측으로 나뉜다.

 

요청(Request)이라는 것은 클라이언트가 서버로 전송해서 서버의 "액션"이 일어나게끔 하는 메시지이다.

 

그리고 응답(Response)는 요청에 대한 서버의 답변이다. 

 

ASCII로 인코딩된 텍스트 정보로 여러 줄로 구성되어 있으며 이 정보들을 파싱 해서 서버 측에서는 어떤 액션을 취할지 정하게 되는 것이다. 

 

GET 그리고 POST는 클라이언트의 요청의 "목적"을 드러내는 것이다.

 

GET는 자원에 대한 조회를 요청하는 것이고 [ 서버에 영향 X ]

 

POST는 전송하는 데이터들에 대하여 서버에 반영해야 하는 것이다. [ 서버에 영향 O ]

 

GET과 POST를 좀 더 들여다보고 크게 차이나는 부분에서 정리해보겠다.

 

GET

HTTP GET 요청에 대한 정보들.

  • 리소스(서버가 가진 자원)를 클라이언트로 가져다 달라는 것을 의미한다.
  • 요청을 전송할 때 데이터를 HTTP Message body에 담지 않고 쿼리 스트링(URL의 끝에 ?와 함께 이름과 값의 쌍을 이루는 요청 파라미터이다. (복수개인 경우 &로 구분) ]
    • 쿼리 스트링으로 데이터가 노출되기 때문에 중요한 데이터를 전송해야 하는 경우에는 GET을 사용해서는
      안된다. 헤더를 통해 데이터를 전송하기에 데이터 전송량에 한계가 있다. 
  • GET은 멱등성을 보장하는데 이는 같은 요청에 대해서는 같은 응답을 받는 성질을 가진다고 보면 된다. 반복되는
    요청의 경우 웹 브라우저의 캐시 데이터에 보관해서 서버로 불필요한 요청을 보내지 않도록 한다. 응답의 조회에
    목적을 두었기에 멱등성을 기반으로 캐시의 효과를 볼 수 있다.

 

POST

  • 리소스를 "생성/변경"하기 위해서 설계된 메서드이다.
  • 클라이언트가 전송한 데이터가 서버로 들어가야 함을 의미한다. [생성, 수정, 삭제 등등]
  • 전송해야 하는 데이터는 HTTP 메시지의 Body에 담아 전송한다. Body는 큰 데이터를 전송할 수 있어 대용량 데이터 전송에 적합하다. GET과는 다르게 쿼리 스트링으로 정보가 드러나지 않아 보안적인 면에서 우수하다고 할 수
    있으나 암호화가 적용되지 않는다면 POST 요청 또한 보안에 취약할 수 있다.
  • 헤더에 Content-Type에 요청 데이터의 타입을 표시해줘야 서버가 처리하기가 편하다.

 

중요한 구분점

1. 멱등성. [ GET은 멱등성을 가지고 POST는 가지지 않는다. ]

GET은 자원에 대한 요청을 보내는 것이기에 서버에 영향을 주지 않는다.. 그저 자원의 존재 유무만 체크하면 되고
그에 맞는 응답을 받으면 된다. 그러기에 멱등성을 보장받을 수 있고 이를 기반으로 웹 브라우저는 캐시 데이터에

요청에 대한 응답(자원)을 미리 기록해둔다. [ 정적인 자원들(이미지, js, css, html 등등) ]

POST의 경우 데이터를 서버에 전송해서 특정 작업을 처리하기에 서버에서의 결과가 POST 요청마다 달라질 수 있다.
그래서 멱등성을 완전히 보장한다고 할 수는 없다. 그래서 별도의 캐시 데이터가 POST 요청을 효율적으로 처리하기
위해서 사용되지는 않는다. 

 

2. 데이터가 어디에 실리는가

GET은 쿼리스트링에 데이터가 드러나기 때문에 보안에 취약하다. HTTP의 헤더에 데이터가 드러난다.

반면 POST의 경우 HTTP 헤더가 아닌 바디에 데이터를 실어 보내기에 외적으로 데이터가 드러나지 않는다. 하지만
그렇다고 보안에 취약한 것은 아니다. 네트워크를 스니핑할 수 있으면 해당 HTTP 메시지를 룩업 하면 암호화되지 않은 경우 바디를 그대로 확인해볼 수 있기에 중요한 데이터는 암호화 과정을 거쳐야 한다.

 

3. 데이터의 양

GET은 서버에 자원을 위한 키워드들을 보내거나 경로와 관련된 정보를 전송하면 된다. [EX. 검색어를 위한 키워드] 

반면 POST는 서버에서 작업하는데 필요한 데이터들을 보내줘야 하기 때문에 상대적으로 보내야 하는 데이터가 많다.
[ 동영상이나 이미지.. 개인 정보 등등 ] 그래서 전송되는 데이터의 양에서 다르다고 볼 수 있다.

 

개인적으로 이 세가지가 중요한 부분이라고 생각된다.

1. 데이터가 어디로 저장되는지(헤더인지 바디인지)

2. GET과 POST의 주 목적이 무엇인지.

3. GET과 POST의 멱등성의 차이. 멱등성을 얻는 경우 얻을 수 있는 이점(캐싱)에 대해서 추가 답변.

4. 데이터 전송양의 차이점.

이렇게 답변하면 좋은 점수를 얻을 수 있지 않을까 한다.

 

이후로는 실무적으로 REST API를 다뤄본 경험이 있다면 GET과 POST에 대한 질문이 실무적인 부분에서 깊게 들어올 수 있다고 생각된다. [ 그 부분은... 개인 경험에 따라서 잘 대답해야 하지 않을까.. ]

 


참고자료

  • 질문을 찾은 사이트. jbee님의 개발자를 위한 면접 질문 link
  • 모질라 : 개발자를 위한 웹 기술 ; HTTP 메시지편 : link [ HTTP 이해에 도움을 주었다. ]
  • 홍시 님의 깃헙 글[가장 담백하고 깔끔하게 정리된 글로 많은 도움을 받았다]. link

이후로의 네트워크 질문은.

 

1. HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0

2. HTTP vs HTTPS

3. TCP/IP의 핸드셰이크

4. TCP vs UDP가 있지 않을까 한다.

 

매일 하나씩 면접 질문을 파헤쳐보도록 하겠다!

반응형