1. 웹 서비스에 사용되는 프로토콜: HTTP(HyperText Transfer Protocol)
HTTP(hypertext transfer protocol)은 응용 계층(application, L7)의 프로토콜로 HTML(HyperText Markup Language)를 전송하는 데 사용되는 프로토콜이다. 최근에는 HTML 이외에도 모든 웹 관련 API 통신에 이용되고 있다. HTTP는 기본적으로 비연결성(Connectionless), 무상태성(Stateless) 특성을 가지고, 요청(request)/응답(response) 동작에 기반하여 아주 단순한 방식으로 서비스를 제공한다. 하지만 HTTP 통신은 신뢰성 있는 데이터 통신이 필요하기 때문에 전송 계층(transfer, L4) 프로토콜인 TCP 위에서 동작하며, 뒤에서 언급할 HTTP의 버전 중 HTTP/1.1 이후에는 상시 연결(persistent connection)이 지원된다.
HTTP와 HTTPS(HTTP 프로토콜을 SSL/TLS를 이용해 암호화한 프로토콜)은 서비스 포트로 각각 TCP 80/443을 사용한다. HTTP의 버전에는 HTTP/0.9, HTTP/1.0, HTTP/1.1, HTTP/2.0, HTTP/3.0 등이 있다. 다음 정리를 참고하자.
HTTP의 버전과 특징
*0.9는 완전 초기 버전이라 따로 설명하지 않겠다
1) HTTP/1.0
- 헤더 지원: 요청과 응답에서 헤더를 사용할 수 있게 되어, 다양한 메타데이터를 교환 가능해졌다
- GET, POST 메소드 사용 가능 (뒤의 메소드에서 더 자세히 다루겠다)
- 상태 코드: 서버 응답에 상태 코드를 추가해, 요청이 성공했는지 실패했는지를 알 수 있게 했다
- 각 요청/응답 마다 새로운 TCP 연결을 해야해서 비효율적이다
2) HTTP/1.1
- 상시 연결(Persistent Connection): 한 번의 TCP 연결을 여러 요청에 재사용할 수 있어 성능이 향상되었다
- Proxy Server를 지원한다
- Cache: Web Cache 지원으로 체감속도와 보안성이 향상되었다
3) HTTP/2.0
- 멀티플렉싱(Multiplexing): 하나의 TCP 연결에서 여러 요청과 응답을 동시에 처리할 수 있어 성능이 크게 향상되었
- 이진 포맷 사용: HTTP/2는 텍스트 기반이 아닌 이진 형식으로 데이터를 전송해 더 빠르고 효율적인 전송이 가능해졌다
4) HTTP/3.0
- TCP 대신 UDP 위에서 작동하는 QUIC라는 새로운 전송 프로토콜을 사용한다
- 전송 방식 멀티 플랙싱이라는 부분에서는 HTTP/2.0과 유사하지만, QUIC를 사용하여 더 빠르고, 신뢰성도 보장되는 버전이다.
- HTTPS의 경우 TWHS의 뒤에 TLS 핸드쉐이크를 하는데, HTTP/3.0에서는 이 두 핸드쉐이크가 통합되었다.
HTTP는 MIME 타입과 content-type 헤더를 사용할 수 있다. 여기서 MIME(Multipurpose Internet Mail Extentions)란 인터넷의 다양한 종류의 데이터를 어떻게 식별하고 전달할지에 대한 표준이다. HTTP는 MIME 타입을 명시함으로서 클라이언트(웹 브라우저..)가 어떤 종류의 데이터를 수신하고 있는지 알 수 있게 하고, HTML, 이미지 등을 올바르게 처리하고 표시할 수 있게 한다. MIME의 다양한 타입들에 대해 궁금하다면 아래 참고 자료를 펼쳐보자.
MIME의 주요 타입들
- text/plain: 일반 텍스트 파일
- text/html: HTML 문서
- image/jpeg: JPEG 이미지
- image/png: PNG 이미지
- application/json: JSON 형식의 데이터
- application/xml: XML 형식의 데이터
- audio/mpeg: MP3 오디오 파일
- video/mp4: MP4 비디오 파일
2. HTTP Request/Response Message 구성
앞서 HTTP는 요청(request)/응답(response) 방식으로 통신한다고 언급하였다. 이제 요청/응답 메세지의 형식(구성)에 대해 알아보자.
1) HTTP Request Message 구성
HTTP 요청 메세지는 다음과 같이 request line, headers, body로 구성되어 있다. request line부터 하나씩 보자.
1. Request Line
메소드(Method)
- 서버에서 무엇을 할지 정의하는 명령어(서버에 ~해줘)
- 주요 메소드
- GET: 클라이언트가 서버로부터 자원(문서, 이미지, 영상)을 읽어오려고 할 때 사용
- POST: 클라이언트가 서버에 데이터를 전송하고, 처리를 요청할 때 사용
URL(Uniform Resource Locator)
- 기본 형식: Protocol://Host:Port/Path
- Protocol: HTTP, HTTPS
- Host: IP 주소, FQDN
- Port: 해당 프로토콜의 기본 포트를 사용하지 않는 경우 지정 가능
- Path: 서버 내에서의 경로
- ex) http://www.daum.net/test.html
- 풀이: www.daum.net 웹서버에 기본포트(80)로 접속하고 http 프로토콜을 사용하여 서버의 DocumentRoot에 있는 test.html 파일을 다운로드 받고 싶다
HTTP Version
- 사용할 HTTP 버전을 알리는 역할
2. Headers
헤더는 요청에 대한 추가적인 정보들을 전달한다. 각 헤더는 키-값 쌍과 개행 문자로 구성되어 있다.
주요 헤더들
- Host: 브라우저 주소 창에 입력한 서버의 이름(FQDN, IP)가 기재
- User-Agent: 클라이언트(브라우저..)의 종류/버전 정보
- Content-Type: 요청에 포함된 데이터의 MIME type 명시
- Accept: 클라이언트가 수신 가능한 콘텐츠 유형 명시
- Accept-Language: 클라이언트가 처리할 수 있는 언어를 서버에 알림
- Accept-Incoding: 클라이언트가 처리할 수 있는 데이터 인코딩(압축) 방식을 서버에 알림
- Referrer: 요청된 URL을 참조하는 문자의 URL에 전달
- If-modified-since: 클라이언트의 캐시를 사용할지 캐시 된 데이터의 날짜로 확인하는 것으로, 이 헤더가 없으면 서버를 처음 방문한 것으로 여기고 데이터를 새로 보내줌
- If-none-match: 브라우저 캐시를 사용할지 말지를 캐시된 데이터의 고유번호로 확인
3. Blank Line, Body
- Blank Line: Headers와 Body 부분을 구분해 주기 위한 공란
- Body: 주로 POST 메소드를 사용하여 서버로 데이터를 적재하는 부분
2) HTTP Response Message 구성
HTTP 응답 메세지는 다음과 같이 Status Line, Headers, Body로 구성되어 있다.
1) Status Line
HTTP Version
- 사용할 HTTP 버전을 알리는 역할
Status Code
- 서버가 클라이언트의 요청에 응답할 때, 요청에 대한 처리 상태를 알리는 목적의 코드
- 상태 코드는 세 자리 숫자로 구성되며, HTTP 처리에 관한 고유의 정보를 의미한다
- 코드 범위와 의미 (더 자세한 내용은 아래 자료를 참고하자)
- 200~299 : 클라이언트 요청에 심각한 문제가 없고, 처리에도 큰 문제가 없었다
- 300~399 : 클라이언트 요청에는 큰 문제가 없었으나, 서버가 서비스할 수 없다
- 400~499 : 클라이언트가 요청한 내용에 문제가 있어 응답이 불가 ex) 문법 문제, 권한 문제..
- 500~599 : 클라이언트 요청에는 큰 문제가 없으나 오류가 발생해 처리할 수 없다
Status Phrase
- 상태 코드에 대한 보조 설명
주로 나오는 Status Code & Phrase 상세 설명
Success | ||
200 | OK |
Client의 요청이 성공적이었으며,
Server는 요청한 Data를 포함하여 정상적으로 응답함
|
Redirection | ||
301 | Moves Permanently |
요청한 URL은 더 이상 안써… 주소 바꼈어. 완전히 이전했어. 바뀐주소 알려줄테니 가봐.
Location 헤더에 변경된 주소를 적어서 알려준다.
|
302 | Found |
요청한 URL 임시로 변경됐어...임시주소 알려줄테니 가봐…
Location 헤더에 변경된 주소를 적어서 알려준다.
|
304 | Not Modified |
If-Modified-Since 헤더에 대한 응답 코드로
지정한 날짜 이래로 수정되지 않음
|
Client Error | ||
400 | Bad Request | Client의 요청에 문법적 오류가 있음. |
401 | Unauthorized | 웹서비스에 로그인(인증)하는 과정에서 실패했을 때 |
403 | Forbidden | 요청한 문서에 대해서 권한이 없어서 줄 수 없어.... |
404 | Not Found | 니가 요청한 웹문서가 서버에 없다고~ |
408 | Request Time-out | 너(Client)의 모든 요청이 지정된 시간안에 처리가안됐어..너무 오래걸려 |
Server Error | ||
500 | Internal Server Error | 서버에서 클라이언트의 요청을 처리하던 중에 오류가 발생하여 멈추거나 오작동하는 상태. |
501 | Not Implemented | Client의 요청을 Server에서 수행할 수 없음 |
502 | Bad Gateway | Server가 다른 Server로부터 응답이 적절치 않음 |
503 | Service Unavailable | Service를 일시적으로 제공하지 못하는 상태 (접속자 폭증 또는 자원의 일시적인 부족 등) **DoS, DDoS 공격 시 나타나는 현상 |
2. Headers
- 요청 메세지와 동일한 구조
- 주요 헤더들
- Server : 브라우저에게 서버의 종류와 버전 등을 알리기 위해 사용. Server Name과 Version를 표시한다
- Set-Cookie : URL을 위해 보유한 정보의 이름/값을 표시한다
- Date : 날짜를 표시한다
3. Body
- 요청한 리소스나 데이터가 포함(JSON, HTML..)
힘들지만 오늘도 해낸 나를 위한 한 마디,
"유쾌하면서도 가볍지 않을 것, 할 말은 할지라도 사려 깊은 태도를 가질 것, 말이 아닌 행동으로 승리하는 사람이 될 것"
'System > Linux' 카테고리의 다른 글
[Linux] Local Repository 만들기 (2) | 2024.10.16 |
---|---|
[Linux] e-mail(Mail Server) (8) | 2024.10.09 |
[Linux] FTP (1) | 2024.10.07 |
[Linux] DNS part 2 (2) | 2024.10.03 |
[Linux] DNS part 1 (0) | 2024.10.01 |