DNS(Domain Name System)는 도메인 이름에 대응하는 IP 주소를 찾아주는 시스템이다.
사용자는 숫자로 된 IP 주소를 외우지 않고도, 기억하기 쉬운 도메인 이름으로 서비스에 접속할 수 있다.
우리는 다른 사람의 전화번호를 모두 외우는 대신, 연락처에 이름과 전화번호를 함께 저장한다.
전화를 걸 때는 이름으로 검색하지만, 실제 연결에는 전화번호가 사용된다.
DNS도 이와 비슷하다.
도메인 이름은 연락처 이름, IP 주소는 전화번호에 해당한다.
브라우저에 도메인 이름을 입력하면 다음과 같은 과정을 거친다.
1. DNS를 통해 도메인에 대응하는 IP 주소를 조회한다.
2. 조회한 IP 주소로 웹 서버에 접속한다.
3. 웹 서버에 웹 페이지를 요청하고 응답을 받는다.
DNS로 조회한 도메인과 IP 주소의 연결 정보가 캐시에 남아 있으면, DNS 서버에 다시 조회하지 않고 해당 정보를 재사용할 수 있다.
HTTP(Hypertext Transfer Protocol)는 클라이언트와 서버가 요청과 응답을 주고받을 때 사용하는 통신 규칙(protocol)이다. 웹 페이지, 이미지, API 데이터 등을 주고받는 데 사용한다.
http://example.com/hello
http: HTTP로 통신하겠다는 스킴example.com: 접속할 서버의 도메인 이름/hello: 요청할 대상의 경로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는 이를 주고받는 공통 규칙을 제공하는 거다.
GET이라는 요청 메서드로 페이지를 요청하고, 서버는 200 OK라는 상태 코드와 페이지 내용을 응답할 수 있다.HTTPS는 HTTP에 TLS(Transport Layer Security)라는 보안 기술을 적용한 통신 방식이다.
HTTP 요청과 응답을 주고받으면서, TLS로 암호화·변조 탐지·서버 인증을 제공한다.
클라이언트와 서버는 통신을 시작할 때 TLS 핸드세이크라는 준비 과정을 거친다.
이 과정에서 암호화 방식을 정하고, 키 교환을 통해 통신에 사용할 비밀 키를 만들어낸다.
비밀 키 자체를 그대로 전송하는 것은 아니다.
이후 HTTP 데이터를 해당 키로 암호화해서 보내고, 받는 쪽에서 복호화한다.
실제 데이터 암호화에는 AES 같은 대칭 키 암호화 방식을 사용한다.
HTTP 데이터 -> 암호화 -> 네트워크로 전송 -> 복호화 -> HTTP 데이터
헤더와 본문뿐 아니라 경로와 쿼리 파라미터도 암호화 대상이다.
다만 접속 대상 IP 주소 같은 네트워크 정보까지 모두 숨겨지는 것은 아니다.
TLS는 데이터를 암호화하면서, 비밀 키와 데이터를 이용한 인증 태그라는 검증값도 생성한다.
받는 쪽은 이 검증값을 확인한다.
중간에서 데이터가 바뀌면 검증에 실패하고, 해당 데이터를 받아들이지 않고 연결을 종료한다.
공격자는 비밀 키를 모르기 때문에 바꾼 데이터에 맞는 검증값을 만들기 어렵다.
일반적인 HTTPS 연결에서 서버는 도메인 이름과 공개 키 등이 담긴 인증서를 제시한다.
브라우저는 다음을 확인한다.
또한 서버는 인증서의 공개 키에 대응하는 개인 키를 보유했다는 사실을 암호학적으로 증명한다.
따라서 인증서 파일만 복사해서 제시하는 것으로는 서버를 사칭할 수 없다.
여기서 확인하는 것은 해당 도메인의 서버라는 사실이지, 그 사이트의 콘텐츠나 운영자가 무조건 믿을 만하나다는 뜻은 아니다.
| 구분 | HTTP만 사용 | HTTPS 사용 |
|---|---|---|
| 통신 내용 | 통신 경로에서 가로채면 읽을 수 있음 | 암호화로 보호 |
| 전송 중 변조 | HTTP 자체는 암호학적 탐지 기능을 제공하지 않음 | TLS 검증 실패로 탐지 |
| 접속 서버 확인 | TLS 인증서를 통한 확인 없음 | 인증서와 개인 키 보유 증명으로 확인 |