
HTTP request 구조
http request 구조는 공백을 제외하고 3가지 부분으로 나뉜다.
- start line
- headers
- body
start line
- http method
- 요청의 의도를 담고 있는 GET, POST, PUT, DELETE등이 있다.- request target
- http request가 전송되는 목표 주소- http version
- version에 따라 request 메세지 구조나 데이터가 다를 수 있어headers
해당 request에 대한 추가 정보를 담고 있는 부분
헤더도 크게 3가지 부분으로 나뉜다. (general, request, entity)
Key : Value 형태로 구성
Host요청하려는 서버 호스트 이름과 포트번호User-agent클라이언트 프로그램 정보. 이 정보를 통해 서버는 클라이언트 프로그램(브라우저)에 맞는 최적의 데이터를 보내줄 수 있다.Referer바로 직전에 머물렀던 웹 링크 주소Accept클라이언트가 처리 가능한 미디어 타입 종류 나열If-Modified-SinceIf-Modified-Since 여기에 쓰여진 시간 이후로 변경된 리소스 취득. 페이지가 수정되었으면 최신 페이지로 교체한다.Authorization인증 토큰을 서버로 보낼 때 쓰이는 HeaderOrigin서버로 Post 요청을 보낼 때 요청이 어느 주소에 시작되었는지 나타내는 값. 이 값으로 요청을 보낸 주소와 받는 주소가 다르면 CORS(Cross-Origin Resource Sharing) 에러가 발생한다.Cookie쿠키 값이 key-value로 표현된다.body
http request가 전송하는 데이터를 담고 있는 부분
전송하는 데이터가 없다면 body 부분은 비어있다.
HTTP response 구조
http response 구조도 공백 제외하고 3가지 부분으로 나뉜다.
- status line
- headers
- body
status line
http response의 상태를 간략하게 나타내주는 부분
- http version
- status code: 응답 상태를 나타내는 코드
- status text: 응답 상태를 간결하게 설명해주는 부분
HTTP/1.1 200 OK [HTTP version] [Status Code] [Status Text]headers - request의 headers와 동일
body - request의 body와 일반적으로 동일
GET 메서드는 서버에서 특정 데이터를 가져와 클라이언트가 조회할 수 있도록 보여주는 용도의 메소드이다.
GET 메서드 사용방법
URL의 끝에 ?를 붙이고, 요청정보가(Key=value)의 해시맵 형태의 쌍을 ?뒤에 붙여서 서버로 전송한다. 요청정보가 여러개일 경우 '&'로 구분한다.
ex)www.url.com?name1=value1&name2=value2
GET 메서드 특징
- URL에 요청 정보를 붙여서 전송하며, 요청 정보가 이어붙기 때문에 길이 제한이 있어 대용량의 데이터를 전송하기 어렵다.
- 한번 요청시 전송 데이터의 양(url+파라미터)은 255자로 제한된다.- URL에 정보들이 그대로 노출되기 때문에 POST 방식에 비해 보안에 취약하다.
- http 패킷의 body는 비어있는 상태로 전송
- body의 데이터 타입을 표현하는 'Content-Type'필드도 http request headers에 들어가지 않음- GET 메서드는 캐싱을 사용할 수 있어 POST방식보다 빠르다
POST 메서드는 클라이언트가 서버의 값이나 상태를 바꾸기 위한 용도의 메소드이다.
POST 메서드 사용 방법
요청 정보를 http 패킷의 body안에 숨겨 서버로 전송한다. request header의 Content-Type에 해당 데이터 타입이 표현되며, 전송하고자하는 데이터 타입을 적어주어야 한다.
ex)POST /members HTTP/1.1 Content-Type: application/json { "username": "hello", "age": 20 }
POST 메서드 특징
- body 안에 요청정보를 숨겨 서버에 전송하기 때문에 GET 방식보다 보안상 안전하다.
- body 안에 요청정보를 숨겨 서버에 전송하기 때문에 대용량의 데이터를 전송하기에 적합하다.
- POST 요청은 GET 방식과는 다르게 캐시되지 않으며 브라우저 히스토리에 남지 않는다.
- 클라이언트에서 데이터를 인코딩하여 서버로 전송하고, 이를 받은 서버에서 해당 데이터를 디코딩한다.
위에서 http response 구조에서 status line에 status code가 http의 상태 코드이다.
클라이언트가 보낸 요청을 서버가 어떻게 처리했는지 한번에 알려주는 3자리 숫자이다. status line에 들어가며, 5개 범주로 나뉜다.
http의 비연결성 특징으로 인해 서버는 클라이언트를 식별할 수 없는데, 이를 stateless라 한다.
--> 매번 새로운 인증을 해야하는 번거로움이 발생
쿠키
쿠키는 웹 브라우저가 보관하는 데이터이다.
웹 서버는 쿠키를 생성하여 웹 브라우저에 정보를 전송 할 수 있다.
쿠키는 key-value 형태로 웹 브라우저의 쿠키 저장소에 저장된다.
서버로부터 쿠키를 전달 받은 웹 브라우저는 이후 웹 서버에 요청을 보낼 때 쿠키를 헤더에 실어서 함께 전송한다.
이를 이용하여 웹 서버와 클라이언트는 필요한 값을 공유하고 상태를 유지할 수 있다.

클라이언트에 보관된 쿠키는 유효기간 설정이 가능하다. 유효기간을 설정하지 않을 시에는 브라우저 종료와 함께 종료된다.
하지만 쿠키만으로 로그인을 구현하는 것에 한계가 존재한다. 쿠키는 네트워크를 통해 전달되기 대문에 중간에 쿠키를 탈취할 수 있다는 취약점이 있다. 이를 보완하고자 세션을 사용한다.
세션
세션도 마찬가지로 클라이언트의 상태를 저장할 수 있다. 쿠키와 다른 점은 쿠키는 각 브라우저의 별도 쿠키 저장소에 저장되는 반면에 세션은 서버에 저장된다.
웹 브라우저는 각각 별도의 세션을 갖는다. 각 세션을 구분하기 위해 고유 ID를 할당하고, 웹 서버는 각 브라우저에 세션 ID를 전송한다. 우베 브라우저는 웹 서버에 연결 시 매번 세션 ID를 보내서 웹 서버가 어떤 세션을 사용할지 알 수 있도록 한다. 이때, 웹 서버와 웹 브라우저가 세션 ID를 주고받기 위해서 사용하는 것이 쿠키이다.
세션은 브라우저가 아닌 서버에서 사용자 정보를 저장하는 구조이기에 쿠키보다는 안전하다.
하지만 세션 정보도 중간에 탈취 당할 수 있기에 보안에 완벽하다고 할 수 없다. 또한 세션을 사용하면 서버의 메모리를 차지하게 되고 동시 접속자가 많은 서비스일 경우 서버 과부화의 원인이 된다.