본문 바로가기

백엔드 개발/SpringMVC

HTTP 요청과 이론

<개요>

HTTP란 무엇인가? 

요청메세지와 응답메세지의 구조, 내용이 어떻게 되는가? 

 

1. HTTP란 무엇인가?  

HTTP (Hyper Text Transfer Protocol)

: 텍스트 기반 전송 프로토콜이다. 

(1) Protocol (프로토콜)이란? 

Protocol은 데이터를 주고 받는 형식에 대한 약속이다.

코치와 투수가 사인을 약속했다고 치자. 모자는 번트 대기, 코는 희생 플라이를 쳐라, 귀 만지면 히트 앤 런 해라 이다. 

두 사람이 서로 맞춘 사인이 프로토콜의 일종이다. 만약 투수가 사인들을 안 외웠다면 코치가 아무리 사인을 보내도 못 알아 먹을 것이다. 

이와 마찬가지로, 클라이언트와 서버간에 프로토콜이 안 맞춰져 있으면, 클라이언트에서 아무리 요청을 보내도, 서버는 그 내용을 읽을 수 없다.

(2) 따라서 HTTP란?

HTTP는 텍스트 기반의 프로토콜이다. 

말 그대로 클라이언트와 서버가 텍스트 기반으로 서로 데이터를 주고 받는 형식을 약속한 것이다.  

(3) HTTP의 특징 3가지 

a. 단순하고 사람이 읽기 편하다. -> 기계어가 아니라 텍스트 기반이어서 사람이 읽기가 좋다.

 

위는 각각 요청 메세지와 응답 메세지의 헤더 부분이다. 헤더는 실제 내용이 담긴 바디에 대한 설명과 정보를 담고 있다. 다 텍스트로 적혀있어서 뭔 내용인지 알기 쉽다.

b. 클라이언트 정보를 따로 저장하지 않는다. 

    (따라서 같은 클라이어트가 요청을 연달아 두 번 보내도, 서버는 그게 같은 클라이언트로부터 온 건지 모른다.

      이걸 보완하기 위해서 쿠키랑 세션을 사용한다.)

c. 약속 내용을 확장 가능하다. 

    (HTTP 메세지에는 헤더 부분과 바디 부분이 있다. 헤더는 바디에 대한 설명이나 정보를 주로 나타낸다.

     HTTP는 표준적으로 제공하는 헤더 내용 이외에 사용자가 추가하고 싶은 헤더를 스스로 작성하여 추가할 수 있다.

     이렇게 사용자가 커스터마이징한 헤더를 커스텀 헤더라고 한다 .)

    

(4) HTTP의 공통적인 구조 

예시는 응답 메세지 이지만, 요청 메세지에도 똑같이 적용된다. 

바디에 우리가 요청하거나, 응답하는 실질 내용이 들어간다. 

헤더는 바디에 대한 정보나 설명을 나타낸다. 

2. 응답 메세지 

(1) 헤더 부분 설명

우리가 URL을 작성하면 위와 같이 브라우저가 요청 메세지의 헤더 부분을 작성한다. 

헤더부분은 크게 상태 라인과 나머지 내용으로 나뉜다. 

상태라인의 앞 HTTP/1.1은 HTTP 버젼 중 무엇을 썼는지 나타낸다.

200이 적힌 부분은 상태 코드이다. 여기는 요청 사항에 대한 작업이 잘 되었는지, 안되었으면 뭐가 문제인지 상태를 간결하게 나타낸다. 

상태코드 의미
1XX 클라이언트와 서버 간의 정보 교환이 목적인 경우 그 상태를 나타냄. (잘 안 쓰임)
2XX 요청에 대한 응답이 성공적으로 이루어졌음을 나타냄.
3XX 다른 URL로 요청해주세요. 
(KT 고객센터에 와이파이가 안 잡힌다고 연락줬더니 내선번호 알려주면서 여기로 연락해보세요~ 하는 거랑 같은 의미)
4XX 클라이언트 잘못 (클라이언트가 요청을 잘못 보냄)
5XX 서버 잘못 (클라이언트가 맞게 요청을 보냈는데, 서버가 해당 요청에 대한 경우의 수를 생각 못해 대비를 못 해놨거나, 에러가 뜬 경우)

 

3. 요청 메세지 

** 여기서는 제일 대표적으로 쓰이는 GET과 POST 요청에 대해서 알아본다.

 

(1)GET과 POST의 구조 

둘 다 요청 메소드

둘 다 공통적으로 헤더와 바디 사이에 빈 줄이 있다. 

이는 헤더가 커스터마이징이 가능해서 길이가 가변적이기 때문에 둘을 구분하기 위해서 이다.

 

 

Get은 이미 서버에 존재하는 리소스를 얻어오는 메소드이다. 컴퓨터 구조에서 배운 Read와 같은 의미. 

Get은 Body가 없다. 만약 요청시 같이 보내야 할 정보가 있으면 URL 끝에 String Query로 짤막하게 보낸다. 

 

Post는 서버에 내가 내용을 기록하기 위한 매소드이다. 컴퓨터 구조에서 배운  Write와 같은 의미. 

Post는 Body가 있다.

 

 

(2)GET과 POST의 특징

GET POST
서버에 리소스를 가져오기 위한 메소드 서버에 데이터를 쓰기 위한 메소드
소용량의 데이터만 전달할 수 있다.
(Why?  Body가 없고, 스트링 쿼리를 이용해서만 데이터를 전달할 수 있기 때문이다.
크롬 기준 쓸 수 있는 스트링 쿼리는 7000자로 작다.)
Body가 있기 때문에 데이터는 무제한 전달 가능
데이터 보안에 취약하고 공유에 유리하다. 
(전송하려는 데이터를 URL 옆에 그대로 써버리니까 누구나 볼 수 있어서 보안에 취약하다.
그 대신 반대로 공유에는 유리하다.)
보안에 강하나 공유에는 불리하다.
(일단 body에 감춰서 보내기 때문에 GET보단 낫지만 이것만으로 보안이 강하다고 볼 수 없다.
진짜 보안이 강한 이유는 구 SSL 현TLS라는 암호화 프로토콜을 이용해 HTTP 메세지 전송할 때 메세지를 암호화 해서 보내기 때문이다.
Body에 담아서 전송하기 때문에 공유는 불리하다.)
ex) 검색엔진에서 검색 단어 전송에 이용 ex) 게시판에 글쓰기, 로그인, 회원가입

 

 

4. 스스로 해보기