DNS, HTTP vs HTTPS란

나미래·6일 전

DNS란?

DNS(Domain Name System)는 도메인 이름에 대응하는 IP 주소를 찾아주는 시스템이다.
사용자는 숫자로 된 IP 주소를 외우지 않고도, 기억하기 쉬운 도메인 이름으로 서비스에 접속할 수 있다.

전화번호부로 이해하기

우리는 다른 사람의 전화번호를 모두 외우는 대신, 연락처에 이름과 전화번호를 함께 저장한다.
전화를 걸 때는 이름으로 검색하지만, 실제 연결에는 전화번호가 사용된다.

DNS도 이와 비슷하다.
도메인 이름은 연락처 이름, IP 주소는 전화번호에 해당한다.

실제 동작 흐름

브라우저에 도메인 이름을 입력하면 다음과 같은 과정을 거친다.
1. DNS를 통해 도메인에 대응하는 IP 주소를 조회한다.
2. 조회한 IP 주소로 웹 서버에 접속한다.
3. 웹 서버에 웹 페이지를 요청하고 응답을 받는다.
DNS로 조회한 도메인과 IP 주소의 연결 정보가 캐시에 남아 있으면, DNS 서버에 다시 조회하지 않고 해당 정보를 재사용할 수 있다.

HTTP란?

HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버가 요청과 응답을 주고받을 때 사용하는 통신 규칙(protocol)이다. 웹 페이지, 이미지, API 데이터 등을 주고받는 데 사용한다.

URL과 HTTP의 관계

http://example.com/hello
  • http: HTTP로 통신하겠다는 스킴
  • example.com: 접속할 서버의 도메인 이름
  • /hello: 요청할 대상의 경로
    URL이 어디에 어떤 방식으로 요청할지 나타낸다면, HTTP는 요청과 응답을 어떤 형식과 의미로 주고받을지 정한다.

HTTP 통신 규칙

HTTP는 메서드, 헤더, 본문 등으로 요청을 구성하고, 상태 코드, 헤더, 본문 등으로 응답을 구성하는 규칙이다. 또한 GET은 조회, 200은 성공처럼 공통으로 해석할 의미를 정의한다.

예를 들어 HTTP/1.1 요청은 이런 모습을 가질 수 있다.

GET /hello?name=kim HTTP/1.1
Host: example.com
Accept: application/json
  • GET-메서드: 해당 대상의 데이터를 조회하겠다는 의미
  • /hello-Path: 요청할 대상의 경로
  • name=kim-Query Parameter: URL에 포함된 추가 정보
  • Host, Accept-Header: 대상 호스트, 받고 싶은 데이터 형식 등의 부가 정보
  • Body: 전달할 데이터가 들어가는 부분. (위 요청에는 없다)

이에 대한 서버 응답은 다음과 같을 수 있다.

HTTP/1.1 200 OK
Content-Type: application/json

{
	"message": "Hello, Kim"
}
  • 200 OK-상태 코드: 요청 성공을 나타내며, 200은 상태 코드
  • Content-Type-Header: 응답 데이터가 Json이라는 의미
  • Body: 실제 응답 데이터

다만 /hello가 어떤 기능인지, name이 무엇을 뜻하는지, JSON에 어떤 필드를 넣을지는 개발자가 정한다. HTTP는 이를 주고받는 공통 규칙을 제공하는 거다.

실제 동작 흐름

  1. 브라우저가 DNS를 통해 도메인에 대응하는 IP 주소를 찾는다.
  2. 서버에 연결하고 HTTP 요청을 보낸다.
  3. 서버는 요청을 처리하고 HTTP 응답을 보낸다.
    예를 들어 브라우저는 GET이라는 요청 메서드로 페이지를 요청하고, 서버는 200 OK라는 상태 코드와 페이지 내용을 응답할 수 있다.

HTTP vs HTTPS

HTTPS는 HTTP에 TLS(Transport Layer Security)라는 보안 기술을 적용한 통신 방식이다.
HTTP 요청과 응답을 주고받으면서, TLS로 암호화·변조 탐지·서버 인증을 제공한다.

1. 암호화 - 통신 내용을 다른 사람이 읽지 못하게 한다

클라이언트와 서버는 통신을 시작할 때 TLS 핸드세이크라는 준비 과정을 거친다.
이 과정에서 암호화 방식을 정하고, 키 교환을 통해 통신에 사용할 비밀 키를 만들어낸다.
비밀 키 자체를 그대로 전송하는 것은 아니다.

이후 HTTP 데이터를 해당 키로 암호화해서 보내고, 받는 쪽에서 복호화한다.
실제 데이터 암호화에는 AES 같은 대칭 키 암호화 방식을 사용한다.

HTTP 데이터 -> 암호화 -> 네트워크로 전송 -> 복호화 -> HTTP 데이터

헤더와 본문뿐 아니라 경로와 쿼리 파라미터도 암호화 대상이다.
다만 접속 대상 IP 주소 같은 네트워크 정보까지 모두 숨겨지는 것은 아니다.

2. 변조 탐지 - 중간에서 데이터가 바뀌었는지 확인한다

TLS는 데이터를 암호화하면서, 비밀 키와 데이터를 이용한 인증 태그라는 검증값도 생성한다.

받는 쪽은 이 검증값을 확인한다.
중간에서 데이터가 바뀌면 검증에 실패하고, 해당 데이터를 받아들이지 않고 연결을 종료한다.
공격자는 비밀 키를 모르기 때문에 바꾼 데이터에 맞는 검증값을 만들기 어렵다.

3. 서버 인증 - 접속한 서버가 요청한 도메인의 서버인지 확인한다

일반적인 HTTPS 연결에서 서버는 도메인 이름과 공개 키 등이 담긴 인증서를 제시한다.
브라우저는 다음을 확인한다.

  • 인증서가 접속하려는 도메인에 유효한가?
  • 인증서의 유효기간이 지나니 않았는가?
  • 신뢰하는 인증기관(CA)으로 이어지는 서명 체인이 유효한가?

또한 서버는 인증서의 공개 키에 대응하는 개인 키를 보유했다는 사실을 암호학적으로 증명한다.
따라서 인증서 파일만 복사해서 제시하는 것으로는 서버를 사칭할 수 없다.

여기서 확인하는 것은 해당 도메인의 서버라는 사실이지, 그 사이트의 콘텐츠나 운영자가 무조건 믿을 만하나다는 뜻은 아니다.

4. HTTP만 사용할 때와의 차이

구분HTTP만 사용HTTPS 사용
통신 내용통신 경로에서 가로채면 읽을 수 있음암호화로 보호
전송 중 변조HTTP 자체는 암호학적 탐지 기능을 제공하지 않음TLS 검증 실패로 탐지
접속 서버 확인TLS 인증서를 통한 확인 없음인증서와 개인 키 보유 증명으로 확인

0개의 댓글