1. TLS/SSL이란?
✨ 기본 개념
TLS(Transport Layer Security)와 SSL(Secure Sockets Layer)은 웹 브라우저와 서버 간의 인터넷 통신을 암호화하여 정보를 안전하게 주고받을 수 있게 해주는 보안 프로토콜이다.
- 역사적 배경: SSL은 1990년대 넷스케이프에 의해 처음 개발되었으나 보안 취약점이 발견되어 폐기되었다. 이를 개선하여 표준화한 것이 TLS이다.
- 현재 상황: 오늘날 우리가 사용하는 대부분의 보안 통신은 TLS 1.2 또는 1.3 버전이다. 하지만 관습적으로 여전히 'SSL'이라는 용어를 혼용하여 사용한다.
✨ 목적
TLS/SSL은 단순히 암호화만 하는 것이 아니라, 안전한 통신을 위한 세 가지 핵심 요소를 보장한다.
| 요소 | 설명 | 구현 방식 |
|---|
| 기밀성 (Confidentially) | 인가되지 않은 제3자가 데이터를 읽을 수 없도록 보호한다. | 대칭키 암호화 (AES 등) |
| 무결성 (Integrity) | 전송 중 데이터가 위조되거나 변조되지 않았음을 보장한다. | MAC(Message Authentication Code) 또는 해시 함수 |
| 인증 (Authentication) | 통신하는 상대방(서버)이 실제 본인이 맞는지 확인한다. | CA(공인 인증 기관) 발행 디지털 인증서 |
2. 사전 지식: 암호화 방식
✨ 대칭키 암호화
암호화할 때와 복호화할 때 동일한 하나의 키를 사용하는 방식이다.
- 특징
- 장점: 계산 속도가 매우 빨라 대용량 데이터를 처리하기에 적합하다.
- 단점: 키가 유출되면 보안이 완전히 무너지며, 통신 대상이 많아질수록 관리해야 할 키의 개수가 기하급수적으로 늘어난다.
- 주요 알고리즘
- AES (Advanced Encryption Standard): 현재 가장 널리 쓰이는 표준이다. 키 길이에 따라 AES-128, 192, 256으로 나뉘며 숫자가 클수록 보안성이 높다.
- 기타: DES, 3DES, ChaCha20 등
- 활용: 데이터베이스 암호화, 파일 및 디스크 암호화(BitLocker 등), VPN 터널 내 데이터 보호
✨ 공개키(비대칭키) 암호화
공개키(Public Key)와 개인키(Private Key)라는 한 쌍의 키를 사용하는 방식이다.
- 특징
- 장점: 키를 직접 전달할 필요가 없어 키 유출 위험이 적고 확장성이 뛰어나다.
- 단점: 대칭키 방식보다 100~1000배 정도 느리고 CPU 부하가 크다.
- 주요 알고리즘
- RSA: 가장 대표적인 알고리즘이지만, 보안을 위해 키 길이가 길어져야 한다는 단점이 있다.
- ECC (Elliptic Curve Cryptography): RSA보다 짧은 키로도 동일한 보안 수준을 제공하며 속도가 빨라 현대 TLS에서 선호된다.
- DSA/ECDSA: 주로 전자서명(인증) 용도로 사용된다.
- 활용: 디지털 인증서, 전자서명, 초기 키 교환
✨ TLS의 하이브리드 방식
TLS는 두 방식의 단점을 보완하고 장점만을 취하기 위해 하이브리드 구조를 채택했다.
- HandShake (공개키 활용): 서버의 공개키를 사용하여 클라이언트가 생성한 난수(대칭키의 재료)를 암호화해 보낸다. 이 과정 덕분에 해커가 중간에 가로채더라도 서버의 개인키 없이는 내용을 알 수 없다.
- 실제 통신 (대칭키 활용): 일단 안전하게 대칭키(세션 키)가 공유되면, 이후의 모든 데이터는 이 키를 사용해 대칭키 방식으로 암호화한다. 덕분에 고화질 영상이나 대용량 파일도 빠르게 주고받을 수 있다.
3. TLS HandShake 상세 과정
✨ Phase 1: 협상 (Hello)
- Client Hello: 클라이언트가 서버에 인사를 건네며 자신의 정보를 보낸다.
- 포함 정보: TLS 버전, 지원하는 암호 방식(Cipher Suite), 클라이언트 난수(Client Random)
- Server Hello: 서버가 클라이언트의 제안 중 하나를 선택해 응답한다.
- 포함 정보: 선택한 TLS 버전 및 암호 방식, 서버 난수(Server Random)
✨ Phase 2: 인증 및 키 교환
- Certificate: 서버가 자신의 신원을 증명하는 CA 인증서를 보낸다. 이 안에는 서버의 공개키가 들어있다.
- Server Hello Done: 서버가 보낼 정보를 모두 보냈음을 알린다.
- Client Key Exchange: 클라이언트는 인증서를 검증한 뒤, 새로운 난수(Pre-Master Secret)를 생성하여 서버의 공개키로 암호화해 보낸다.
- 이제 클라이언트와 서버는 Client Random, Server Random, Pre-Master Secret 3가지를 모두 가지게 되며, 이를 조합해 실제 통신에 쓸 대칭키(Master Secret)를 만든다.
✨ Phase 3: 암호화 적용 및 확인
- Change Cipher Spec: "이제부터 우리가 합의한 대칭키로 암호화해서 보낼게!"라고 선언하는 단계이다. (8번도 동일)
- Finished: 핸드셰이크 과정의 모든 메시지를 해싱하여 암호화한 뒤 보낸다. 서로 이 값을 복호화해 확인하며 과정에 오류나 변조가 없었는지 최종 점검한다. (9번도 동일)
✨ Phase 4: 데이터 전송
핸드셰이크가 성공적으로 끝나면, 생성된 대칭키를 이용해 실제 HTTP 데이터를 암호화하여 주고받는다.
4. 단계별 상세 설명
✨ Step 1: Client Hello (제안 및 탐색)
- 설명: 클라이언트가 서버에 연결을 시도하며 자신의 보안 역량을 제시한다.
- 포함 정보
- TLS 버전: 클라이언트가 지원하는 TLS 버전 (예: TLS 1.2, 1.3)
- Random 데이터: 나중에 세션 키 생성에 사용될 랜덤 값
- Cipher Suite 목록: 지원하는 암호화 알고리즘 목록
- 예:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- 압축 방식: 지원하는 압축 알고리즘
- 확장 기능: SNI(Server Name Indication) 등
⭐ SNI(Server Name Indication): 하나의 IP에 여러 도메인이 있을 때, 어떤 도메인에 접속하려는지 서버에 알려주어 올바른 인증서를 보낼 수 있게 한다.
✨ Step 2: Server Hello (협상 완료)
- 설명: 서버는 클라이언트의 제안 중 가장 보안 수준이 높으면서 서로 지원 가능한 방식을 선택하여 응답한다.
- 포함 정보
- 선택된 TLS 버전
- Random 데이터: 서버가 생성한 랜덤 값
- 선택된 Cipher Suite: 사용할 암호화 알고리즘
- 세션 ID: 연결이 끊겼을 때 핸드셰이크 과정을 생략하고 빠르게 재연결하기 위한 식별자
- 선택된 압축 방식
✨ Step 3: Certificate (인증서 전송)
✨ Step 4: Server Hello Done (준비 완료)
- 설명: 서버가 인증서 전송을 완료했음을 알린다.
- 선택사항: 서버가 클라이언트 인증서도 요구할 수 있다. (양방향 인증)
✨ Step 5: Client Key Exchange (비밀 재료 전달)
✨ Step 6: Change Cipher Spec (클라이언트)
- 설명: 클라이언트가 "이제부터 암호화 통신을 시작합니다"라고 알린다.
✨ Step 7: Finished (클라이언트)
- 설명: 클라이언트가 검증 메시지를 보낸다.
- 내용
- 지금까지 주고받은 모든 HandShake 메시지를 해싱한다.
- 생성한 대칭키로 암호화하여 전송한다.
✨ Step 8: Change Cipher Spec (서버)
- 설명: 서버도 "암호화 통신 시작"을 알린다.
✨ Step 9: Finished (서버)
- 설명: 서버도 검증 메시지를 보낸다.
- 검증
- 서버도 모든 HandShake 메시지를 해싱한다.
- 클라이언트가 보낸 값과 비교한다.
- 일치하면 대칭키로 암호화한 Finished 메시지를 전송한다.
5. 보안 메커니즘
✨ 중간자 공격(MITM) 방지
중간자 공격이란, 해커가 클라이언트와 서버 사이에서 통신을 가로채고 조작하는 것을 말한다.
TLS는 이를 세 가지 방어선으로 막아낸다.
- 인증서 체인(Chain of Trust) 검증
- 서버가 보낸 인증서가 신뢰할 수 있는 CA(인증 기관)에 의해 서명되었는지 확인한다.
- 브라우저는 '루트 CA'의 공개키를 이미 가지고 있으며, 이를 통해 루트 CA → 중간 CA → 서버 인증서로 이어지는 신뢰의 사슬을 검증한다.
- Handshake 무결성 확인 (Finished 메시지)
- 핸드셰이크 과정에서 오간 모든 메시지를 해싱하여 대칭키로 암호화해 서로 교환한다.
- 만약 중간에 해커가 암호 알고리즘을 약한 것으로 바꾸는 등의 조작을 했다면, 해시값이 일치하지 않아 즉시 연결이 차단된다.
- 재생 공격(Replay Attack) 방지
- 클라이언트와 서버가 매번 생성하는 Random 데이터는 일종의 '일회용 번호(Nonce)' 역할을 한다.
- 해커가 이전에 성공했던 통신 패킷을 그대로 복사해서 다시 보내더라도, 랜덤 값이 매번 다르기 때문에 서버는 이를 무효한 요청으로 간주한다.
✨ 완전 순방향 비밀성 (PFS: Perfect Forward Secrecy)
가장 강력한 보안 기능 중 하나로, "오늘 서버의 개인키가 털려도, 어제 주고받은 대화는 안전하다"는 원칙이다.
- 기존 방식 (RSA 키 교환): 서버의 개인키가 유출되면, 해커가 과거에 캡처해둔 모든 통신 데이터를 복호화할 수 있는 치명적인 약점이 있다.
- PFS 방식 (DHE/ECDHE)
- 고정된 개인키를 사용하는 대신, 매 세션마다 임시 키(Ephemeral Key)를 생성하여 대칭키를 만든다.
- 통신이 끝나면 이 암시 키는 즉시 파기되므로, 나중에 서버의 마스터 개인키가 유출되더라도 과거의 통신 내용을 복구할 방법이 없다.
- 현대 TLS(1.3 등)에서는 이 PFS 방식을 필수적으로 사용한다.
✨ 데이터 무결성 및 인증 (MAC/HMAC)
데이터가 전송 중에 1비트라도 바뀌지 않았음을 보장하는 장치이다.
- HMAC (Hash-based Message Authentication Code)
- 송신자는 데이터와 대칭키를 조합해 해시값(MAC)을 만들어 데이터 뒤에 붙인다.
- 수신자는 받은 데이터와 자신의 대칭키로 직접 해시를 계산해보고, 받은 MAC과 일치하는지 확인한다.
- 이를 통해 데이터 변조 여부와 보낸 사람이 본인이 맞는지를 동시에 확인한다.
✨ 보안 메커니즘 요약

✨ 최신 보안 강화 기술
| 기술 | 설명 | 효과 |
|---|
| HSTS | 브라우저에게 "이 사이트는 무조건 HTTPS로만 접속해"라고 강제하는 설정 | HTTP 강제 전환 공격 방지 |
| OCSP Stapling | 서버가 미리 인증서 유효성 확인서를 받아 클라이언트에게 전달 | 인증서 확인 속도 향상 및 프라이버시 보호 |
| TLS 1.3 | 취약한 암호화 방식(DES, MD5 등)을 완전히 제거 | 보안 구멍 원천 차단 |
6. 인증서 검증 과정
브라우저는 서버가 보낸 인증서가 진짜인지 확인하기 위해 '신뢰의 사슬(Chain of Trust)'을 거슬러 올라가며 검증을 수행한다.
✨ 인증서 체인 검증 (Chain of Trust)
대부분의 서버 인증서는 루트 CA가 직접 발급하지 않고, 보안을 위해 중간 CA(Intermediate CA)를 거쳐 발급된다.
- 서버 인증서 수신: 서버가 자신의 인증서와 중간 CA 인증서를 함께 보낸다.
- 중간 CA 검증: 서버 인증서에 찍힌 서명이 중간 CA의 것인지 확인한다.
- 루트 CA 검증: 중간 CA 인증서에 찍힌 서명이 루트 CA의 것인지 확인한다.
- 최종 신뢰 확인: 브라우저(또는 OS)의 신뢰할 수 있는 루트 인증서 저장소(Trust Store)에 해당 루트 CA가 등록되어 있는지 확인한다.
✨ 단계별 상세 검증 로직
- 디지털 서명 복호화 및 비교
- 과정: 브라우저는 상위 CA의 공개키를 사용하여 인증서에 포함된 '디지털 서명'을 복호화한다.
- 검증: 복호화해서 나온 해시값과, 브라우저가 직접 인증서 내용을 해싱한 값이 일치하는지 비교한다.
- 의미: 1비트라도 수정되었다면 해시값이 달라지므로 데이터 변조 여부를 완벽히 알 수 있다.
- 인증서 메타데이터 검증
- 도메인(Subject Alt Name): 인증서에 찍힌 도메인(예:
*.naver.com)과 사용자가 주소창에 입력한 주소가 일치하는지 확인한다.
- 유효 기간(Validity): 현재 시간이 인증서의 '시작일'과 '만료일' 사이에 있는지 확인한다.
- 실시간 폐기 여부 확인 (Revocation Check)
인증서가 유효 기간 내에 있더라도, 키 유출 등의 사유로 취소되었을 수 있다.
- CRL (Certificate Revocation List): CA가 배포하는 '취소된 인증서 목록' 파일을 다운로드하여 대조한다. (목록이 커지면 느려짐)
- OCSP (Online Certificate Status Protocol): CA 서버에 "이 인증서 아직 괜찮나요?"라고 실시간으로 물어본다.
- OCSP Stapling: 서버가 미리 CA로부터 "이 인증서는 안전함"이라는 증명서를 받아두었다가 클라이언트에게 전달하여 속도를 높인다.
✨ 인증서 종류에 따른 신뢰 수준
| 종류 | 검증 대상 | 특징 |
|---|
| DV (Domain Validation) | 도메인 소유권 | 가장 빠르고 저렴함 (Let's Encrypt 등) |
| OV (Organization Validation) | 도메인 + 실존 기업 | 기업의 실재성을 확인하여 신뢰도 높음 |
| EV (Extended Validation) | 매우 엄격한 기업 심사 | 과거 주소창에 회사 이름이 직접 표시되던 가장 높은 등급 |
✨ 검증 실패 시 발생하는 일
하나라도 검증에 실패하면 브라우저는 "연결이 비공개로 설정되어 있지 않습니다"라는 무시무시한 경고창을 띄워 사용자를 보호한다.
이는 중간자 공격(MITM)이나 피싱 사이트일 가능성이 높기 때문이다.
7. 실제 예시
✨ 웹사이트 접속 실례: 네이버(Naver) 접속 시
우리가 주소창에 https://www.naver.com을 입력하고 페이지가 뜨기까지의 찰나(약 0.5초~1초)에 일어나는 일이다.
- TCP 연결: 먼저 서버와 3-Way Handshake를 통해 기본적인 통신 통로를 연다.
- TLS Handshake 수행
- 브라우저가 네이버 서버의 인증서를 받아 '진짜 네이버'인지 확인한다.
- 서로 암호화 알고리즘을 맞추고, 데이터를 암호화할 대칭키(세션 키)를 생성한다.
- 암호화 데이터 전송: 이제 생성된 대칭키로 HTML, 이미지, 개인정보 등을 암호화하여 주고받는다.
- 사용자 확인: 주소창에 자물쇠 아이콘🔒이 표시되며, 사용자는 안전한 연결임을 인지한다.
✨ 성능 최적화 기술
HTTPS는 암호화 과정 때문에 HTTP보다 느리다는 편견이 있었지만, 최신 기술들은 이를 거의 극복했다.
- TLS 1.3: 1-RTT 핸드셰이크
- 기존(TLS 1.2): 암호화 통신을 시작하기 위해 클라이언트와 서버가 2번씩 왔다갔다(2-RTT) 해야 했다.
- 개선(TLS 1.3): 첫 번째 메시지에 암호화에 필요한 정보를 미리 담아 보내 단 1번의 왕복(1-RTT)으로 과정을 끝낸다.
- 세션 재사용 (Session Resumption)
- Session ID: 서버가 이전에 접속했던 클라이언트의 정보를 기억해 두었다가, 재접속 시 핸드셰이크 과정을 대폭 생략한다.
- Session Ticket: 서버 대신 클라이언트가 암호화된 티켓을 가지고 있다가 재접속 시 서버에 보여주는 방식이다. (서버의 메모리 부담을 줄여준다.)
- 0-RTT (Zero Round Trip Time)
- 개념: 이전에 접속했던 사이트라면, 핸드셰이크가 끝나기도 전에 첫 번째 요청 메시지와 함께 암호화된 데이터를 바로 보내버리는 기술이다.
- 장점: 체감 속도가 비약적으로 빨라진다.
- 주의(Trade-off): 해커가 해당 패킷을 가로채 똑같이 다시 보내는 재생 공격(Replay Attack)에 취약할 수 있어, 결제 같은 민감한 작업에는 사용하지 않는다.
✨ TLS 1.2 vs. 1.3 성능 비교
| 항목 | TLS 1.2 | TLS 1.3 |
|---|
| 핸드셰이크 속도 | 2-RTT (느림) | 1-RTT (빠름) |
| 재연결 속도 | 1-RTT | 0-RTT (즉시) |
| 보안성 | 오래된 암호 방식 지원 (취약) | 최신 암호 방식만 지원 (강력) |
| 성능 최적화 | 기본 수준 | 최적화 설계 (CPU 부하 감소) |
✨ 기타 최적화 기법
- HSTS (HTTP Strict Transport Security): 브라우저가 처음부터 HTTPS로만 접속하도록 강제하여, HTTP에서 HTTPS로 리다이렉트되는 시간(약 0.1초~0.2초)을 절약한다.
- OCSP Stapling: 인증서 유효성 확인을 서버가 대신 처리하여 클라이언트의 대기 시간을 줄인다.
✨ 성능 최적화 흐름도
