[네트워크] HTTP & HTTPS
HTTP 프로토콜이란?
HTTP(Hypertext Transfer Protocol)는 텍스트 기반의 통신 규약으로, 인터넷 상에서 데이터를 주고받기 위해 서버/클라이언트 모델을 따르는 프로토콜입니다.
동작 방식
앞서 언급했듯이, HTTP는 서버/클라이언트 모델을 따릅니다. 클라이언트에서 요청을 보내면 서버는 요청을 처리해서 응답합니다. 이때, HTML 문서 외에도 JSON 데이터나 XML 등의 정보를 주고받을 수 있습니다.
참고로, 초기 HTTP는 오직 HTML 문서를 주고 받기 위해서 설계되었습니다.
클라이언트 (Client)
서버에 요청하는 클라이언트 소프트웨어(IE, Chrome, Firefox,...)가 설치된 컴퓨터를 이용합니다. 클라이언트는 URI를 이용해서 서버에 접속하고 데이터를 요청할 수 있습니다.
서버 (Server)
클라이언트의 요청을 받아서 요청을 해석하고 응답을 하는 소프트웨어(Apache, nginx, IIS,...)가 설치된 컴퓨터를 이용합니다. 웹 서버는 보통 표준 포트인 80번 포트로 서비스를 합니다.
예시로 알아보는 HTTP
클라이언트 프로그램에서 사용자가 회원 가입을 요청하게 되면, 서버로 회원 정보를 보내게 되고 서버는 회원 정보를 저장한 후 잘 저장했다고 클라이언트에 응답합니다. 이 과정에서 클라이언트와 서버 간의 교류가 HTTP라는 규약을 이용합니다.
요청 (Request)
클라이언트가 서버에게 연락하는 것을 요청이라고 하며, 요청을 보낼 때는 요청에 대한 정보를 담아 서버로 보냅니다.
요청의 종류 (Request Method)
1) Get: 자료를 요청할 때 사용
2) Post: 자료의 생성을 요청할 때 사용
3) Put: 자료의 모든 부분에 대해 수정을 요청할 때 사용
4) Patch: 자료의 일부분에 대해 수정을 요청할 때 사용
5) Delete: 자료의 삭제를 요청할 때 사용
6) Options: preflight 요청할 때 사용 (CORS와 관련)
요청 HTTP 메시지 예시
GET https://www.test.com HTTP/1.1 // 시작 줄
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... // 헤더
Upgrade-Insecure-Requests: 1
// 본문 - 현재는 없음.
[시작 줄]
첫 줄은 시작 줄로 메서드 종류, URI, HTTP 버전으로 구성되어 있습니다.
- GET : HTTP Method
- https://test.com : 사이트 주소
- HTTP/1.1 : HTTP 버전
[헤더]
두 번째 줄부터는 헤더이며, 요청에 대한 정보를 담고 있습니다. User-Agent, Upgrade-Insecure-Requests 등 많은 헤더가 있습니다.
[본문] - 헤더에서 한 줄 띄고
본문은 요청을 할 때 함께 보내는 데이터를 담는 부분입니다. 예시에서는 주소로 Get 요청만 보내고 있고, 따로 데이터를 담아 보내지는 않아서 비어있는 상태입니다.
응답 (Response)
서버가 요청에 대한 답변을 클라이언트에게 보내는 것을 응답이라고 합니다.
상태 코드 (Status Code)
상태 코드는 많은 종류가 있으며, 모두 숫자 세 자리로 이루어져 있습니다. 아래와 같이 크게 다섯 부류로 나눌 수 있습니다.
- 1XX (조건부 응답): 요청을 받았으며 작업을 계속한다.
- 2XX (성공): 클라이언트가 요청한 동작을 수신하여 이해했고, 성공적으로 처리했다.
- 3XX (리다이렉션 완료): 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
- 4XX (요청 오류): 클라이언트에 오류가 있음을 나타낸다.
- 5XX (서버 오류): 서버가 유효한 요청을 명백하게 수행하지 못했음을 나타낸다.
응답 HTTP 메시지 예시
HTTP/1.1 200 OK // 시작 줄
Connection: keep-alive // 헤더
Content-Encoding: gzip
Content-Length: 35653
Content-Type: text/html;
<!DOCTYPE html><html lang="ko" data-reactroot=""><head><title... // 본문
[시작 줄]
첫 줄은 HTTP 버전, 상태 코드, 상태 메시지로 구성되어 있습니다.
[헤더]
두 번째 줄부터는 헤더로, 응답에 대한 정보를 담고 있습니다.
[본문]
응답에는 대부분의 경우 본문이 있습니다. 보통 데이터를 요청하고 응답 메시지에는 요청한 데이터를 담아서 보내기 때문입니다. 현재 응답 메시지에는 HTML이 담겨 있는데, 이 HTML을 받아 브라우저가 화면에 렌더링 할 수 있습니다.
HTTP의 특징
1) TCP/IP를 위에서 동작하는 응용 프로토콜입니다.
2) 연결 상태를 유지하지 않는 비 연결성 프로토콜입니다.
3) 상태가 없는 무상태 프로토콜입니다.
4) 요청/응답 방식으로 동작합니다.
비 연결성 (Connectionless)
HTTP는 Connectionless 방식으로 작동하는데, 이 방식은 클라이언트와 서버가 한 번 연결을 맺은 후, 클라이언트 요청에 대해 서버가 응답을 마치면 맺었던 연결을 끊어 버리는 특징을 갖고 있습니다. 기본적으로 자원 하나에 대해서 하나의 연결을 만드는데, Connectionless 작동 방식은 아래의 장단점을 갖습니다.
장점
- 불특정 다수를 대상으로 하는 서비스에 적합한 방식입니다.
- 수십 만 명이 웹 서비스를 사용하더라도 접속 유지는 최소한으로 할 수 있기 때문에 더 많은 유저의 요청을 처리할 수 있습니다.
단점
- 연결을 끊어버리기 때문에 클라이언트의 이전 상태를 알 수가 없는데, 이러한 HTTP의 특징을 무상태(Stateless)라고 합니다.
- 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 여러 문제가 생깁니다. 예를 들어 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수가 없습니다.
무상태 (Stateless)
위에서 언급했듯이 비연결적인 특성으로 연결이 해제됨과 동시에 서버와 클라이언트가 이전에 요청한 결과에 대해서 잊어버리게 된니다. 즉, 클라이언트가 이전 요청과 같은 데이터를 원한다고 하더라도 다시 서버에 연결을 하여 동일한 요청을 시도해야 합니다. HTTP는 이러한 무상태 특성으로 인해 독립적인 쌍의 요청과 응답을 처리하기 때문에, 단순하고 상태를 저장해야 하는 서버의 부담을 줄일 수 있습니다.
쿠키 (Cookie)
쿠키는 웹 브라우저가 보관하는 데이터입니다. 웹 서버는 쿠키를 생성하여 웹 브라우저에 정보를 전송할 수 있고, 쿠키는 key-value 형태로 웹 브라우저의 쿠키 저장소에 저장됩니다. 서버로부터 쿠키를 전달받은 웹 브라우저는 이후 웹 서버에 요청을 보낼 때 쿠키를 헤더에 실어서 함께 전송하고, 이를 이용하면 웹 서버와 클라이언트는 필요한 값을 공유하고 상태를 유지할 수 있습니다.
하지만 쿠키는 네트워크를 통해 전달 되기 때문에 중간에 쿠키를 탈취할 수 있다는 취약점이 있습니다. 쿠키에 바로 아이디와 비밀번호 값이 들어 있으면 위험하기 때문에 이를 보완하고자 세션이나 토큰이라는 방식을 도입할 수 있습니다.
세션 (Session)
세션도 마찬가지로 클라이언트의 상태를 저장할 수 있습니다. 쿠키와 다른 점은, 쿠키는 각 브라우저의 별도 쿠키 저장소에 저장되는 반면 세션은 서버에 저장이 됩니다.
웹 브라우저는 각각 별도의 세션을 갖습니다. 각 세션을 구분하기 위해 고유 ID를 할당하고, 웹 서버는 각 브라우저에게 세션 ID를 전송합니다. 웹 브라우저는 웹 서버에 연결 시 매번 세션 ID를 보내서 웹 서버가 어떤 세션을 사용할지 알 수 있도록 합니다. 이때, 웹 서버와 웹 브라우저가 세션 ID를 주고받기 위해 사용하는 것이 쿠키이며, 세션 ID를 쿠키에 넣는다고 생각하면 됩니다.
위 그림은 쿠키와 세션을 종합하여 로그인이 이루어지는 과정입니다.
우리는 로그인 정보를 웹 컨테이너 메모리의 세션 객체에 저장하게 되고, 클라이언트는 세션 ID를 전송하여 브라우저 고유 세션을 식별하게 됩니다. 이후 세션 객체 내부에 로그인 여부를 확인할 수 있는 특정 속성이 존재하면 로그인한 것으로 판단할 수 있습니다.
토큰 (Token)
토큰 기반 인증의 방법으로 많은 웹 서버들은 JWT (JSON Web Token)을 사용합니다. 토큰 기반 인증 방식은 유저의 정보가 서버에 저장되지 않는 무상태라는 특징이 있으며, 흐름은 다음과 같습니다.
1) 유저가 로그인을 하고 서버에 세션을 이용해서 정보를 기록하는 대신, 토큰을 발급 받습니다.
2) 클라이언트는 발급된 토큰을 로컬 스토리지에 저장하거나, 토큰을 쿠키에 담아서 쿠키 저장소에 저장합니다.
3) 클라이언트는 요청 시 저장된 토큰을 Authorization 헤더에 포함하여 보냅니다.
4) 서버는 매 요청 시 클라이언트로부터 전달받은 헤더의 토큰 정보를 검증합니다.
HTTPS 프로토콜이란?
HTTPS는 Hypertext Transfer Protocol Secure의 약자로 보안이 강화된 HTTP 프로토콜입니다. HTTP 프로토콜만으로 통신을 수행하면, 다음과 같이 평문 데이터가 모두 노출이 됩니다. 즉, 암호화되지 않은 데이터를 전송하기 때문에 서버와 클라이언트가 주고받는 메시지를 외부에서 볼 수 있기 때문에 보안에 취약하며, 이러한 취약점을 보완하고자 만들어진 것이 바로 HTTPS입니다.
와이어 샤크를 이용하면 위와 같이 HTTP 패킷을 확인할 수 있는데, 유저의 민감한 데이터가 그대로 노출되는 것을 확인할 수 있습니다.
HTTPS의 동작 과정
HTTPS는 SSL이라는 보안 프로토콜 위에서 동작하는 HTTP다. 그렇다면, SSL과 TLS가 무엇일까?
SSL은 Secure Socket Layer의 약어로, 응용 계층과 전송 계층 사이에서 동작하는 보안 소켓 계층을 뜻합니다. 인터넷 상에서 데이터를 안전하게 전송하기 위한 인터넷 암호화 통신 프로토콜이라고 생각하면 됩니다. SSL은 전자상거래 등의 보안을 위해 넷스케이프 사에서 처음 개발하였고, 시간이 지나 TLS로 표준화되었다고 합니다.
참고
- https://shlee0882.tistory.com/107
- https://velog.io/@surim014/HTTP란-무엇인가
- https://tansfil.tistory.com/58
- https://hyuntaeknote.tistory.com/m/3
예상 면접 질문 및 답변
링크 참고
'컴퓨터 공학 > 네트워크' 카테고리의 다른 글
[네트워크] Load Balancer (2) | 2021.12.07 |
---|---|
[네트워크] DNS (0) | 2021.12.01 |
[네트워크] TCP/IP 흐름제어 & 혼잡제어 (0) | 2021.11.17 |
[네트워크] TCP 3 way handshake & 4 way handshake (0) | 2021.11.10 |
댓글