GET 메서드와 POST 메서드 제대로 이해하기

SUNGKYUM KIM·2023년 5월 7일
1
post-thumbnail

개발을 시작하게 되면 가장 먼저 알고 듣게 되는 정보 중 하나인 GET과 POST 메서드..! 뿐 아니라 가장 많이 쓰이는 HTTP 메서드라고 해도 과언이 아닐 겁니다.

클라이언트 개발을 즐기는 입장에서는 쓰기만 많이 하다보니 원리나 의미도 모르고 사용할 때가 많은데 이번 글을 통해 제대로 정리하고 이해해보도록 하겠습니다.

가장 먼저는 HTTP 메서드가 무엇인지 알고가는 것이 좋겠죠?

HTTP란?

HTTP (Hypertext Transfer Protocol)는 월드 와이드 웹 (WWW)에서 데이터를 주고받기 위한 표준 프로토콜

문서로서의 기능을 뛰어넘는(Hyper) 글(Text)를 이용해 이 세상 어딘가에 있는 또 다른 컴퓨터와 연결(link)하여 접근하고 정보를 전송(Transfer)하고 또 받아올 수 있도록 하는 HTTP 프로토콜 덕분에 우리는 현대 컴퓨터 시스템인 클라이언트-서버 모델을 이용하여 효율적이고 아름다운 WWW 생태계를 이룩할 수 있었죠.

HTTP는 TCP/IP 프로토콜을 기반으로 하며(이 전글에서 자세히 설명해놓았습니다), 웹 브라우저와 웹 서버 간의 요청(Request)-응답(Response) 방식으로 작동합니다. 클라이언트가 서버에 요청을 보내면, 서버는 요청을 처리하고 그 결과를 클라이언트에게 응답합니다. 이때 요청과 응답주고 받는 방식으로 가장 많이 채택하는 것이 HTTP 메시지인 것이죠.

그럼 Method는 뭐야?

HTTP 동사라고도 불리는 HTTP 메서드는 HTTP 요청이 쿼리(데이터베이스 등에서 원하는 정보를 검색하기 위해 요청하는 행위)된 서버에서 기대하는 작업을 나타냅니다. 요청을 보내는 동시에 내가 어떤 일을 하려고 하는지 함께 보내줌으로써 우리는 혼동없는 통신을 할 수 있게 되는 것이죠.

이 때 가장 일반적인 두 가지 HTTP 메서드가 바로 'GET'과 'POST'입니다. 'GET' 요청은 응답으로 정보(Data)를 기대하는 반면(일반적으로는 HTML과 같은 것이겠지만 저와 같은 모바일 앱 개발자는 JSON Data를 더 많이 받게 되겠죠?) 'POST' 요청은 일반적으로 클라이언트가 웹 서버에 정보를 제출하고 있음을 나타냅니다. 이 정보에는 ID, 비밀번호 등 여러가지 정보들이 들어갈 수 있겠죠.

즉, GET요청은 서버를 통해 데이터를 받아오기만 할 수 있는데 반해, POST요청은 요청하는 쪽에서 데이터를 제공함과 동시에 데이터베이스에서 무언가 변화가 일어나기를 바랄 수 있는 요청이라는 것이죠.

이젠 GET과 POST 두 가지가 각각 어떤 특징이 있는지, 또 어떤 차이점이 있는지 알아보도록 하죠!

GET Method

HTTP 메서드 중 하나로, 클라이언트가 서버에게 리소스를 요청하는방법이라고 말씀드렸죠? 이때 GET요청을 하기 위해 HTTP요청에 GET 요청임을 명시하고 URL을 사용하여 원하는 서버에 정보를 요청해야 합니다. 여기서 필요하다면 쿼리스트링(Query String)을 이용하여 파라미터를 넣어주어 요청을 구체화 할 수 있습니다. 예를 들어 어떤 사용자의 것인지 ID를 특정하여 정보를 요청할 수 있겠죠.

구조는 아래와 같습니다.

GET /search?q=apple HTTP/1.1
Host: example.com
...

위 예시에서, 첫 줄에는 GET 메소드와 요청 경로와 함께 쿼리 파라미터 q=apple이 명시되어 있습니다. 그 다음 줄부터는 요청 헤더가 나열되어 있습니다.

서버 측에서는 이러한 GET 요청의 쿼리 파라미터를 파싱해서, 사용할 수 있는 형태로 변환하거나 처리할 수 있습니다. 요청 헤더와 쿼리 파라미터에 포함된 정보를 기반으로 서버는 요청을 처리하고, 그 결과를 클라이언트에게 응답합니다.

위와 같은 형태로 인해 GET요청을 사용할 때에는 주의가 필요합니다. GET 요청에서 URL 뒤에 전달되는 파라미터들은 모두 노출되기 때문에(id나 password같은 정보들), 요청하는 데이터에 민감한 정보가 포함되어 있을 경우에는 보안상의 이유로 GET 요청을 사용해서는 안 됩니다.

한편, GET 요청은 요청한 리소스가 캐시될 수 있다는 특징이 있습니다. 따라서 불필요한 요청을 제한할 수도 있죠. 이는 자주 변경되지 않는 데이터를 가져올 때 유용합니다. 예를 들어, 같은 이미지 파일이 여러 번 요청되는 경우에는 GET 요청으로 가져오는 것이 서버와 클라이언트의 부하를 줄일 수 있습니다. 캐시는 응답 헤더의 cache-control를 이용하여 제어할 수 있습니다.

POST Method

POST 요청은 GET과는 다르게 데이터 HTTP 메시지의 Body에 담아서 전송할 수 있습니다. 그리고 그 Body의 타입은 요청 헤더의 Content-Type에 따라 결정되게 됩니다.

아래의 예시를 보겠습니다.

POST /signup HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 25

username=john&password=1234

위 예시에서, 첫 줄에는 POST 메소드와 요청 경로가 명시되어 있습니다. 그 다음 줄부터는 요청 헤더가 나열되어 있으며, 이어지는 바디에는 전송할 데이터가 담겨 있습니다. 바디 데이터는 Content-Type 헤더에 명시된 데이터 형식으로 인코딩되어 전송됩니다.

위 예시에서는 Content-Type이 application/x-www-form-urlencoded로 설정되어 있으므로, 바디 데이터가 key1=value1&key2=value2와 같은 형식으로 인코딩되어 전송됩니다. 이 경우, 바디 데이터의 길이를 Content-Length 헤더에 명시해야 합니다.

서버 측에서는 이러한 POST 요청의 바디 데이터를 파싱해서, 사용할 수 있는 형태로 변환하거나 처리할 수 있습니다. 요청 헤더와 바디 데이터에 포함된 정보를 기반으로 서버는 요청을 처리하고, 그 결과를 클라이언트에게 응답합니다.

POST 요청은 데이터의 크기 제한이 없어서, 대량의 데이터를 전송할 때 유용합니다. 또한, GET 요청과는 달리 요청하는 데이터가 URL 뒤에 노출되지 않아 보안상의 이점이 있습니다.

하지만, POST 요청도 완전히 안전한 것은 아닙니다. 예시로 크롬의 개발자 도구Fiddler 와 같은 툴로 요청 내용을 확인할 수도 있기 때문이죠. 따라서 서버 측에서 요청하는 데이터를 처리할 때 적절한 검증과 보안 처리를 하지 않으면, 악의적인 사용자에 의해 보안이 취약해질 수 있으니 보안은 언제나 철저히 신경써야겠죠?

정리

오늘은 평소 아무런 생각없이 마냥 사용하기만 하던 GET과 POST요청에 대해서 자세히 알아보았습니다! 여러 연구자들에 의해 ‘잘’만들어져 있기 때문에 우리도 자세한 원리를 모르더라도 ‘잘’ 사용만 하면 문제가 되지 않겠지만 가끔 개발 중에 막히게 되었을때 이런 CS지식들이 빛을 발한다는 생각이 드네요.

오늘도 긴글 읽어주셔서 감사합니다!

Reference

profile
Code For Christ

0개의 댓글