"주소창에 google.com을 치면 이후에 어떤일이 일어나나요?"
대표적인 면접 질문으로 개발자로써 알아야할 많은 것들을 담고 있는 질문이다. 이질문에 대한 답을 알아보기 전에 OSI 7 계층 모델을 알아두면 이해하는데 도움이 된다. 아래의 OSI 7 계층 모델에 대한 설명은 필요할떄마다 위로 올라와 확인하는 것으로 족하다.
OSI 7 계층 모델:
- 계층 7: 응용 계층(Application Layer): 사용자와 가장 가까운 계층으로, 이메일, 웹브라우저 등의 애플리케이션 서비스가 이루어집니다.
- 계층 6: 표현 계층(Presentation Layer): 데이터의 인코딩 및 디코딩, 암호화 및 복호화 등을 처리합니다.
- 계층 5: 세션 계층(Session Layer): 네트워크상의 두 노드간의 연결 세션을 관리합니다.
- 계층 4: 전송 계층(Transport Layer): TCP/UDP와 같은 프로토콜이 이 계층에서 동작하여 신뢰성 있는 데이터 전송을 보장합니다.
- 계층 3: 네트워크 계층(Network Layer): IP 프로토콜을 포함하여 패킷의 경로를 결정하고 네트워크간의 라우팅을 담당합니다.
- 계층 2: 데이터 링크 계층(Data Link Layer): 네트워크 기기 간의 데이터 전송을 관리하며, MAC 주소를 활용합니다.
- 계층 1: 물리 계층(Physical Layer): 실제 데이터를 전기적 신호로 변환하여 네트워크 매체를 통해 전송하는 역할을 합니다.
1계층(물리 계층)과 2계층(데이터 링크 계층)은 실제로 일어나고 있지만 일반적으로 웹 브라우징과 같은 높은 수준(high level)의 작업에서는 특별히 언급하지 않는다. 이제 주소창에 어떤 도메인을 입력(7:Application Layer)하면 어떤 일이 일어나는지 알아보자.
주소창에 도메인을 입력하면 가장 먼저 도메인에 대응하는 IP 주소(Internet Protocol Address: 인터넷 프로토콜에 의해 컴퓨터나 장치에 할당되는 고유한 식별자)를 찾아야한다. 도메인은 사람들이 알아보기 쉽게 나타낸 별명이 뿐이고, 서버에 연결하여 무엇인가 응답을 받으려고 한다면 내부적으로는 IP 주소가 필요하다. DNS(Domain Name System)는 흔히 전화번호부에 비유된다. 그도 그럴것이 DNS는 이름 그대로 도메인의 이름을 담은 서버이기 때문이다.
사용자가 웹 브라우저에 웹사이트 로드요청을 보내면 컴퓨터는 IP 주소를 찾기 위해 가장 가까운 전화번호부(DNS서버)를 찾게 된다. DNS는 하나만 존재하는 것이 아니다. 그래서 우선 가장 가까운 Local DNS캐시에서 IP를 찾는다.
만약 DNS캐시에 원하는 IP가 없다면 브라우저는 DNS요청 쿼리를 DNS 재귀 리졸버(DNS recursive resolv er)로 보내게 되다. 이제 이 리졸버가 도메인 이름을 IP주소로 변환하는 일련의 작업들을 대신 수행하게 된다. 이 리졸버는 일반적으로 사용자의 ISP에서 담당한다.
리졸버가 가장 처음 하는 일은 root nameserver에서 TLD(top level domain)서버를 찾는 것이다.(이 경우도 캐시되어있으면 생략됨) root nameserver는 모든 TLD서버의 위치를 가지고 있다.
TLD 서버는 .com 이나 .org와 같은 레벨의 서버라고 볼 수 있다. 하지만 이 서버에서도 google.com을 포함한 모든 하위 도메인에 대한 정보를 가지고 있기 힘들기 때문에 권한 있는 네임서버(Authoritative Nameserver)에 최종 권위를 위임하게 된다.
처음에 도메인을 이용해 IP주소를 찾는 임무를 맡은 리졸버는 드디어 답을 찾을 수 있는 곳에 도달했다. 권한 있는 네임서버(Authoritative Nameserver)는 특정 도메인에 대한 DNS 질의에 대해 응답할 수 있는 네임서버이다. 이 서버는 요청한 도메인에 대한 모든 정보를 알고 있으며, 다른 서버나 클라이언트가 도메인에 대한 특정 정보를 요청하면 그에 대해 응답할 수 있다.
지금까지도 한 일이 많다. 하지만 이제 어디로 가야할지 알았을 뿐이다.
IP(Internet Protocol)프로토콜(이하 IP)은 데이터를 효율적으로 전달하기 위한 일련의 규칙을 정의하는데, 이 규칙에 따르면, 데이터는 패킷이라는 작은 단위로 분할되고, 각 패킷에는 출발지 IP 주소와 목적지 IP 주소가 부여된다. 위에서 목적지 IP 주소를 알았으니, 이제 데이터 전송을 위해 IP를 적용할 준비가 된것이다. 비연결 상태인 사용자와 서버를 IP를 사용하여 연결할 수 있다. IP는 사용자로부터 서버까지의 경로를 지정해준다.(사실 서버가 있는 네트워크까지의 경로를 보장하며, 이후는 포트번호에 따라 서비스에 전달된다) 이제 사용자와 서버간의 데이터 전송이 가능하게 된 것이다.
"어디로" 데이터(패킷) 전송하는 것만으로는 충분하지 않다. 데이터를 "어떻게" 안전하게 전송할 것인가도 중요한 문제이다. 그리고 이를 TCP(Transmission Control Protocol)가 담당한다. TCP는 우선 three-way handshake이란 방법으로 사용자와 서버간의 안전한 연결을 설정한다. (5:Session Layer)
연결이 설정되고 데이터를 전송하기 시작하면 TCP는 데이터를 작은 조각들로 나눠 TCP 세그먼트에 담게 된다.
TCP 세그먼트가 포함하는 정보들
- 소스 포트와 목적지 포트
- TCP 세그먼트가 전송될 순서정보를 담은 시퀀스 번호
- 수신측이 이미 받은 세그먼트의 정보를 담은 확인 응답 번호
- 그리고 세그먼트의 무결성을 확인할 체크섬
만들어진 TCP 세그먼트는 IP 레이어로 전달된다.
이제 TCP 세그먼트에 세그먼트의 원점 IP 주소와 목적지 IP 주소를 담은
IP 헤더가 추가 하여 IP 데이터그램을 만드는데 이 IP 데이터그램이 인터넷을 통해 전송 된다.
그리고 데이터그램이 수신지에 도착하면, IP 레이어에서 IP 데이터그램의 IP 헤더를 제거하고 다시 TCP 세그먼트로 만들어서 TCP 레이어로 전달한다.
이제 TCP 레이어에서는 TCP 헤더를 분석하여 해당 세그먼트가 어느 애플리케이션에 속하는지, 어떤 순서로 재조립해야 하는지 등을 판단한다.
TCP 에서 데이터의 무결성을 확인하는 주요 방식은 체크섬(checksum)을 사용하는 것이다.
체크섬은 보내는 측에서 데이터 패킷에 대해 계산되며, 이 계산된 값이 데이터 패킷과 함께 수신측에 전되는데, 수신측에서는 전송된 데이터 패킷에 대해 같은 체크섬 계산을 수행하고, 계산된 체크섬이 보낸 측에서 받은 체크섬과 일치하는지 확인한다.
이 방법으로, 데이터의 무결성이 보장되며, 패킷의 손상 여부를 감지할 수 있다. 만약 체크섬이 일치하지 않는다면, 이는 패킷이 전송 중에 손상되었을 수 있음을 나타내고, TCP는 재전송 요청을 보내 손상된 패킷을 다시 받는다.
그러나 TCP 체크섬은 기본적인 오류 검출 메커니즘을 제공할 뿐이며, 모든 종류의 오류를 검출할 수 있는 것은 아니다. 특히 체크섬은 악의적인 공격이나 데이터 변조를 검출하는 방법으로 사용되지는 않아서, 이러한 보안 문제를 해결하기 위해 보안 프로토콜인 SSL/TLS 같은 기술을 사용한다.
IP는(3: Network Layer) 네트워크상에서 데이터 패킷을 효율적으로 전달하는 방법을 정의했다. 그리고 이후에 TCP로(4: TransPort Layer) 데이터 전송을 위한 세션 관리(5: Session Layer)와 데이터의 신뢰성을 보장하는 방법을 정의 했다. 이제 데이터를 주고받는 방법에 대해서 정의해야 한다. 이를 HTTP(Hypertext Transfer Protocol)가 담당한다.
클라이언트(예: 웹 브라우저)가 HTTP 요청을 생성할 때, 이 요청은 요청 메소드(GET, POST, PUT, DELETE 등), URL, 헤더 정보, 그리고 선택적으로 본문(body)로 구성된다. 클라이언트는 이 HTTP 요청을 웹 서버에 전송한다.
웹 서버는 요청을 요청 메소드와 URL, 그리고 요청 본문에 담긴 정보에 따라 처리합니다.
웹 서버는 처리한 결과를 HTTP 응답은 상태 코드(200, 404, 500 등), 헤더 정보등을 담아 HTTP 응답으로 클라이언트에게 돌려준다.
클라이언트는 HTTP 응답을 받아 처리(6: Presentation Layer) 하게 되는데, 웹 서버에서 보내는 데이터를 JSON, XML, HTML등과 같은 상황에 맞는 데이터를 알맞게 변환하는 작업을 한다.
실제로 이 데이터를 어플리케이션(여기서는 웹 브라우저)이 어떻게 사용할지, 어떻게 표현할지는 7계층인 Application Layer에서 다루게 되기 때문에, HTTP로 웹 데이터를 받는 일까지는 Presentation Layer에서 일어나는 일의 일부이다.
Application Layer 로써의 HTTP
OSI 모델에서 7계층은 Application Layer로, 여기에서는 특정 프로그램이나 애플리케이션이 네트워크를 통해 데이터를 송수신하는 것을 총괄하게 된다. HTTP가 Application Layer의 프로토콜로 분류될 수 있는 이유는 HTTP가 클라이언트와 서버 사이의 '인터페이스' 역할을 수행하기 때문이다. 일반적으로 '인터페이스'라는 용어는 두 시스템이나 컴포넌트가 상호작용하는데 사용되는 공통된 방법이나 절차를 설명하는데, HTTP 프로토콜이 클라이언트(보통 웹 브라우저)와 서버 간의 통신 방식을 정의하며, 이를 통해 클라이언트가 서버에서 원하는 정보를 요청하고 받아올 수 있도록 해주기 때문이다. 그러므로, HTTP가 애플리케이션 데이터의 생성과 소비를 관리 하게 되고 이와 같은 이유로 HTTP를 7계층인 Application Layer의 프로토콜로 분류하기도 한다.
HTTPS는 HTTP 프로토콜의 보안이 강화된 버전으로, HTTP에 TLS(Transport Layer Security) 또는 그 이전 버전인 SSL(Secure Sockets Layer)을 추가하여 구현 되었다. 이 두 프로토콜은 데이터를 암호화하여 전송함으로써 전송 과정에서 해독되거나 수정되지 않게 보호 하므로써 데이터의 기밀성을 보장하고 인터넷을 통해 데이터를 안전하게 전송한다.
HTTPS가 사용되는 경우 URL은 "https://"로 시작하며, 웹 브라우저는 보통 주소 표시줄에 자물쇠 아이콘을 표시하여 사용자에게 현재 사이트가 안전하다는 것을 알려준다.
HTTPS는 다음과 같은 이점을 제공합니다:
이러한 이유로 HTTPS는 웹 사이트에서 민감한 정보(예: 신용 카드 번호, 비밀번호 등)를 처리할 때 권장되는 프로토콜이다. 또한 웹사이트의 SEO(Search Engine Optimization, 검색 엔진 최적화) 점수를 높이는 데에도 이점이 있다.
계층 7: 응용 계층(Application Layer): HTTP, HTTPS 등과 같은 프로토콜을 사용하여 사용자의 요청을 처리하고, 서버로부터의 응답을 제공.
계층 6: 표현 계층(Presentation Layer): HTTP, HTTPS 프로토콜 내에서 데이터의 인코딩, 암호화, 압축 등을 담당.
계층 5: 세션 계층(Session Layer): TCP의 three-way handshake는 네트워크 상에서 컴퓨터 간의 연결(세션)을 관리합니다.(4 way로 세션을 닫는것 까지)
계층 4: 전송 계층(Transport Layer): TCP는 데이터의 전송을 관리하고, 필요한 경우 재전송을 수행하면서 데이터의 신뢰성 있는 전송이 가능.
계층 3: 네트워크 계층(Network Layer): IP를 사용하여 데이터 패킷의 라우팅(경로 결정)과 전달.
유익한 글이었습니다.