HyperText Transfer Protocol의 두문자어로 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 초기에는 HTML과 같은 하이퍼텍스트를 주로 전송했지만, 최근에는 Plain text, JSON, XML 등 다양한 형태의 정보도 전송하는 애플리케이션 레이어 프로토콜이다.
*하이퍼 텍스트: 참조(하이퍼링크)를 통해 한 문서에서 다른 문서로 즉시 접근할 수 있는 텍스트이다. 기존의 문서가 순차적이면서 서열형 구조라면, 하이퍼텍스트는 링크에 따라 그 차례가 바뀌는 임의적이면서 나열형인 구조를 가진다.
*어플리케이션 레이어 프로토콜 : 컴퓨터 네트워크에서 인터넷 프로토콜 컴퓨터 네트워크를 통하는 프로세스 간 통신 접속을 위해 설계되어 통신 프로토콜과 방식을 위해 보유된 추상 계층이다.
HTTP 특징
클라이언트 - 서버 구조
클라이언트는 UI/UX에 집중하고 서버에서 비즈니스 로직과 데이터를 처리하는 등 서버와 클라이언트의 역할을 분리한 클라이언트-서버 구조이다.
🧐 클라이언트-서버 구조란? 클라이언트는 유저와 상호작용을 담당하고, 서버는 리소스요청과 응답에 대한 처리를 하도록 역할이 분리되어 있는 구조이다. HTTP프로토콜을 통해 서버-클라이언트 간 request와 response를 주고 받는다.
-클라이언트 서버와 연결된 모든 단말기와 웹에 접근하는 단말기 내 소프트웨어를 지칭하는 것으로 보통은 브라우저를 나타낸다. 사용자의 입력을 처리하여 서버에 요청을 보내는 역할을 한다.
-서버 클라이언트의 요청을 받아 처리하고 클라이언트에게 응답을 보낸다. 어떠한 형태로든 클라이언트의 요청을 받아 응답을 제공하면 서버가 될 수 있다.
TCP/IP 기반
브라우저가 웹 서버와 통신하기 위해 사용하는 주요 프로토콜로 TCP/IP기반으로 서버와 클라이언트의 요청과 응답을 전송한다.
🧐 TCP/IP 프로토콜이란? 전송 제어 프로토콜인 TCP와 인터넷 프로토콜인 IP의 합성어로 인터넷 동작의 중심이 되는 통신규약이다.
-TCP 역할: 데이터 흐름 관리, 데이터 전달 보증 -IP 역할 : 패킷 목적지 주소 지정, 경로 제어, 비신뢰성, 비연결형
IP는 기본 데이터 단위인 데이터그램이 목적지에 성공적으로 도달되는 것을 보장하지 않는 비신뢰성의 특징과 전달되는 데이터그램의 상태정보를 유지하지 않으며 각 데이터그램이 독립적으로 처리되는 비연결형의 특징을 갖는다. 따라서 전송 제어 프로토콜인 TCP와 함께 사용한다. 즉, TCP/IP를 기반으로 한다는 것을 IP주소 지정과 TCP의 안정적인 전송 특성을 활용해 논리적 연결을 수행하며 순서대로, 신뢰할 수 있는 데이텉 교환이 이루어진다는 것이다.
비연결성(Connectionless)
연결 상태를 유지하지 않는 비연결성 프로토콜(Connectionless)이다.
🧐 비연결성이란? 클라이언트와 서버가 한 번 연결을 맺고 클라이언트 요청에 대해 서버가 응답을 마치면 연결을 끊어버리는 성질이다.
연결을 유지하면 리소스가 계속 사용되고, 부족해지면 다른 사용자가 이용하지 못하기 때문에 더 많은 연결을 위해 비연결 지향으로 설계되었다. 하지만, 서버가 클라이언트를 기억하고 있지 않아 동일한 클라이언트의 모든 요청에 대해 매번 새로운 연결 시도/해제의 과정을 거쳐야 해 3 way handske의 시간이 추가되어 오버헤드가 발생한다는 단점이 있다. HTTP 1.0부터는 keep-alive 헤더를 통해 연결을 유지할 수 있다. (HTTP 1.1붙터 별도 명시가 없으면 모든 연결이 지속연결로 간주) 자원 하나를 요청했을 때 이와 묶여 있는 모든 자원을 요청하기 위해 연결을 유지한 상태로 연결 횟수가 줄어들어 효율적인 처리가 가능하다.
무상태성(Stateless)
각각의 요청을 독립적인 트랜잭션으로 취급하는 무상태 프로토콜(Stateless)이다.
🧐 무상태란? 비연결성을 가지기 때문에 서버는 클라이언트를 식별할 수 없어 매번 새로운 인증을 해야 한다. 이러한 번거로움을 해결하는 대표적인 방법은 아래와 같다.
-쿠키/세션 기반 인증 브라우저가 서버와 연결이 되면 서버는 해당 클라이언트에 대한 유일한 값인 세션 ID를 부여하고 세션 스토리지에 저장한다. HTTP헤더에 실어 클라이언트에게 보내면 브라우저는 세션 ID를 포함하는 쿠키를 저장하고 있고, 이후 요청 시 헤더의 쿠키에 세션 ID를 담아서 전송한다. 서버는 클라이언트의 요청의 쿠키 내 세션 ID와 세션 스토리지에 담긴 세션 ID를 대조해 인증 여부를 판단한다. 즉, 세션은 서버에서 가지고 있는 정보이고 쿠키는 서버에서 발급된 세션을 열기 위한 키 값인 세션ID를 보관하는 곳이다.
-토큰 기반 인증 토큰은 인증을 위해 사용되는 암호화된 문자열이다. 서버는 토큰을 생성해서 클라이언트로 보내고, 클라이언트는 HTTP 헤더에 실어 서버에 전송하며 유효성을 검사한다. 토큰을 사용하면 서버나 세션에 의존하지 않고 클라이언트측에서 들어오는 요청만으로 작업을 처리하기 때문에 상태를 유지하지 않으므로 Stateless한 구조를 갖는다. 토큰은 제한된 수명을 가지고 만료되면 새로 생성되어야 한다.
HTTP는 웹 서버와 브라우저 사이에 정보를 송수신하는데 사용하는 클라이언트와 서버 프로토콜이다.
1989년 영국의 컴퓨터 과학자인 팀 버너스 리(Tim Berners-Lee)가 월드 와이드 웹(World Wide Web)을 고안하면서 설계한 프로토콜이다.
주로 HTML 문서를 주고 받는데 사용한다.
HTML(HyperText Markup Language) : 웹을 이루는 구성 요소이다. 웹 페이지가 어떤 구조로 이루어져 있는지 브라우저가 알 수 있도록 하는 마크업 언어!!❌프로그래밍 언어 아님❌ - HyperText : 웹 페이지를 다른 페이지로 연경하는 링크이다. - Markup Language: 태그 같은 수많은 요소를 사용<h1>이런 태그</h1>하는 언어
Protocol: 규칙이다. 특정 기기 간에 데이터를 주고받기 위해 정의되었다. “나는 이렇게 줄게! 넌 저렇게 받아! 난 너가 준거 요렇게 받을게!
✅ HTTP는 client-server 모델을 따르는 protocol이다.
client-server protocol
클라이언트(client) : 요청을 보내는 쪽 (일반적으로 웹 브라우저) 엔지니어들과 자신들의 어플리케이션을 디버그하는 웹 개발자들이 사용하는 프로그램들은 예외
서버(server) : 요청을 받는 쪽 (일반적으로 데이터를 보내는 원격지 컴퓨터)
요청(request) : 클라이언트에 의해 전송되는 메시지
응답(response) : 서버가 요청에 대해 전송하는 메시지
1. 웹 브라우저(Client)가 HTTP(규칙)를 통해 웹 서버(Server)로부터 웹 페이지나 이미지 정보를 요청한다.
2. 웹 서버(Server)는 이 요청에 응답하여 필요한 정보를 해당 사용자에게 전달하게 된다.
예를 들면 'http://www.tta.or.kr'과 같이 'http://'로 시작되는 URL을 지정한다.
여기에 있는 데이터를 HTTP(규칙)를 사용하여 서버에서 클라이언트로 전송한다.
HTTP 프로토콜로 데이터를 주고받기 위해서는 아래와 같이 요청(Request)을 보내고 응답(Response)을 받아야 한다.
URL이란?
protocol : 규약 http, ftp, telnet
host : 웹 서버의 위치
IP 주소 : 도메인 아니면 Ip 주소를 쓴다. ex) 127.0.0.1
domain name : host name의 일부분, 보통 도메인으로 불림 ex) example.com, kr, net
port : USB 포트를 생각해보자. 연결되는 gate로 컴퓨터와 다른 컴퓨터와 서로 연결되는 통로
표준 HTTP 포트 80, HTTPS는 443이다. 표준 포트를 사용할 경우 보통 생략한다.
resource path : 파일 위치다. 자원에 대해 웹서버에서 추상화한 경로다. 없으면 표시되지 않는다.
매개변수(query or parameter) : 웹 서버에서 보내는 추가 파라메터
fragment identifier : 부분 식별자
HTTP 프로토콜의 특징
1. HTTP 프로토콜은 stateless한 프로토콜이다. 상태가 없지만 세션은 있다.
상태가 없다 : 상태를 저장하지 않는다. 데이터를 주고 받기 위한 각각의 데이터 요청이 서로 독립적으로 관리가 된다.
서버는 세션같이 별도 추가 정보를 관리하지 않아도 된다. (다수의 요청 처리 및 서버의 부하를 줄일 수 있는 성능상의 이점)
2. 일반적으로 네트워크 프로토콜은 TCP/IP 프로토콜 위에서 동작한다. HTTP 기본 포트는 80번이다.
프록시(Proxy)란 무엇인가?
웹 브라우저와 서버 사이에 수많은 컴퓨터와 머신이 HTTP 메시지를 이어 받고 전달하는데 그 중 애플리케이션 계층에서 동작하는 것이다.
서버 대신 클라이언트의 요청을 중계 받는다.
프록시는 주로 보안을 위해 사용된다. 즉, 모든 웹 트래픽 흐름 속에서 신뢰할 만한 중개자 역할을 한다.
게이트웨이? 프록시? 차이점.. 프록시 서버는 컨텐트 캐시, 보안, 필터링 등의 역할을 하는 중개자라면 게이트웨이는 서로 다른 네트워크 통신에서 서로 다른 프로토콜을 호환가능하게 하는 특별한 서버라고 볼 수 있을 것 같다.
요청과 응답 사이에는 여러 개체들이 있다. 게이트 웨이 또는 캐시 역할을 하는 프록시 등
Application Layer protocol
응용 계층(Application Layer)은 [OSI 7계층]에서 7계층을 담당하는 녀석으로 HTTP가 속해 있다.
실제로 브라우저와 요청을 처리하는 서버 사이에 좀 더 많은 컴퓨터들이 존재한다. (라우터, 모뎀 등)
웹의 계층적 설계 덕분에 이들은 네트워크와 전송 계층 내로 숨겨지고 HTTP는 애플리케이션 계층의 최상위에 있다.
HTTP 요청 메소드(Http Request Methods)
URL을 통해 서버에 특정 데이터를 요청할 수 있다.
요청하는 데이터에 특정 동작을 수행해야 할 때 Http Request Methods를 사용한다.
GET: 존재하는 자원에 대한 요청
POST: 새로운 자원을 생성
PUT: 존재하는 자원에 대한 변경
DELETE: 존재하는 자원에 대한 삭제
기타 요청 메소드 HEAD, OPTIONS(CORS에서 사용) 등이 있다.
HEAD
요청에 대해 body 없이응답 헤더만 제공한다.
GET, HEAD를 제공하는 api에 GET과 HEAD를 각각 요청해보면 GET은 응답 body가 있고, HEAD는 응답 body가 없다. 응답 header는 동일하다.
데이터 양이 줄어들기 때문에 빠르게 서버의 상태를 조회할 수 있다.
응답 헤더의 Content-Length 또한 동일하기 때문에 resource 양에 대한 조회만 할 때에는 HEAD method가 유용할 수 있다.
OPTIONS
해당 end point가지원하는 method가 무엇인지 알아볼 때에 사용하는 method
어떤 method를 지원하는지 응답 헤더 Allow로 제공
options로만 요청해보면 어떤 method를 지원하는지노출되기 때문에 보안 취약성을 가진다.
HTTP 상태 코드(HTTP Status Code)
서버에서 설정해주는 응답(Response) 정보이다.
이 상태 코드로 에러 처리를 할 수 있다.
2XX 성공을 의미함
200 : GET 요청에 대한 성공
204 : No Content 성공하긴 했는데 응답 본문에 대한 데이터가 없음
205 : Reset Content 성공했으나 클라이언트의 화면을 새로고침하도록 권고함
206 : Partial Content 성공했으나 일부 범위의 데이터만 반환함
3XX 리다이렉션
클라이언트가 이전 주소로 데이터를 요청함 서버에서 새 URL로 리다이렉트를 유도하는 경우
301 : Moved Permanently 요청한 자원이 새 URL에 존재함
303 : See Other 요청한 자원이 임시 주소에 존재함
304 : Not Modified 요청한 자원이 변경되지 않아서 클라이언트에서 캐싱된 자원을 사용하도록 권고함 -ETag와 같은 정보를 활용하여 변경 여부를 확인함
4XX 클라이언트 에러
클라이언트의 코드가 잘못됐거나 유효하지 않은 자원을 요청했거나 권한이 잘못된 경우
400 : Bad Request 잘못된 요청
401 : Unauthorized 권한 없음 Authorization 헤더가 잘못된 경우
402 : 이 응답 코드는 나중에 사용될 것을 대비해 예약됨. 지금은 사용되고 있지 않음.
403 : Forbidden 서버에서 해당 자원에 대해 접근 금지
404 : Not Found 요청한 자원이 서버에 없음
405 : Method Not Allowed 지원하지 않는 요청을 하였을 때 사용
5XX 서버 에러
서버쪽에서 오류가 난 경우
501 : Not Implemented 요청 동작에 대해 서버가 수행할 수 없음
503 : Service Unavailable 서버가 과부하 또는 유지 보수로 내려간 경우