미리 알림: 이 글은 필자의 이해를 위해 개인적으로 정리한 글이니 틀린 내용이 있을 수 있음.
다른 더 좋은 블로그 글이나 관련 사이트 글을 보는 것을 추천합니다.
시작하며
부끄러운 이야기지만... 뭔가 알긴 아는데 개념을 정확히 모르는 게 많다. (사실 모르는 건 부끄러운 게 아니다. 아는 척하는 게 부끄러운 거지.) 자격증 공부하다가 SSL, TLS 가 보기에 나오는 경우가 많아서 이번에 정리해보기로 한다.
1. SSL 이란
- Secure Sockets Layer, 보안 소켓 계층
- SSL이란 암호화 기반 인터넷 보안 프로토콜
- 인터넷 통신 간의 전송되는 개인정보 보호, 인증, 데이터 무결성을 보장한다.
- SSL은 현재 사용 중인 TLS 암호화의 전신
- 요즘은 주로 TLS 인증서를 사용하지만 사람들은 여전히 SSL이라고 부르기도 함
- SSL/TLS를 사용하는 웹사이트의 URL에는 "HTTP" 대신 "HTTPS"가 있음
2. TLS 이란
- Transport Layer Security, 전송 계층 보안
- TLS은 SSL의 향상된, 더욱 안전한 버전
- TLS 버전 1.0은 SSL 버전 3.1로서 개발을 시작했지만 상호 운영 안됨
3. SSL/TLS를 왜 써야 하는가
- 원래 웹 상 데이터는 메시지를 가로채면 누구나 읽을 수 있는 데이터 형태 였음
- SSL 은 이때 사용자 개인 정보를 보호하기 위해 생겨남
- 사용자와 웹 서버 사이를 이동하는 모든 데이터를 암호화하여 인터넷 연결을 보호한다.
- 누군가 가로채더라도 무작위 문자만 확인 가능
4. SSL/TLS 동작 방법
여기서부터는 아래 출처의 내용으로 바로 들어가서 읽는 것을 권장
아래 내용은 나의 이해를 위해 정리한 것임
컴퓨터와 컴퓨터가 네트워크를 이용해서 통신을 할 때는 내부적으로 3가지 단계가 있다.
악수 (handshake) -> 전송 -> 세션 종료
- 서버/클라이언트가 보안 연결을 열고 공개 키를 교환하는 SSL/TLS handshake로 시작된다.
- SSL/TLS handshake 동안 서버/클라이언트는 세션 키를 생성하고 세션 키는 SSL/TLS handshake 후 모든 통신을 암호화 및 복호화한다.
- SSL/TLS 은 암호화된 데이터를 전송하기 위해 대칭키와 공개키를 혼합해서 사용한다.
- 세션키(대칭키)는 공개키 방식으로 암호화한다.
- 세션이 생성된 이후 실제 데이터는 세션키(대칭키) 방식으로 암호화하여 주고받는다.
- 세션이 종료되면 세션키(대칭키)는 폐기된다.
- 각각의 새 세션에서 통신을 암호화하는데 서로 다른 세션 키가 사용된다.
4.1 Handshake
간단히 보는 TLS/SSL Handshake 프로세스
간단하게 SSL 핸드셰이크 프로세스를 알아보자. 아래 링크의 글을 옮긴 것이다.
https://www.digicert.com/kr/what-is-an-ssl-certificate#What-is-an-SSL-Certificate
SSL 인증서는 "SSL 핸드셰이크”라는 과정을 통해 웹사이트/서버와 브라우저 간에 암호화된 연결을 수립합니다. 웹사이트 방문자에게는 이 과정이 보이지 않으며, 순간적으로 이루어집니다
기본적으로 SSL 연결을 설정하는 데에는 공개 키, 개인 키, 세션 키라는 세 가지 키가 사용됩니다. 공개 키로 암호화된 모든 데이터는 개인 키로만 해독할 수 있으며, 그 반대도 마찬가지입니다.
개인 키와 공개 키를 사용한 암호화 및 복호화는 많은 처리 능력을 요구하기 때문에 대칭 세션 키(symmetric session key)를 생성하기 위한 SSL 핸드셰이크 중에만 사용됩니다. 보안 연결이 설정된 후에는 전송되는 모든 데이터에 세션 키가 사용됩니다.
- 브라우저 SSL(https)로 보호된 웹 서버(웹 사이트)에 연결함. 브라우저에서 서버가 자신의 신원을 증명하도록 요청함.
- 서버 서버의 공개 키를 포함하여 자신의 SSL 인증서 사본을 보냄
- 브라우저 공인 인증 기관 목록과 대조해 인증서 루트를 확인하고, 인증서가 만료, 해지되지 않았는지, 연결하는 웹사이트의 일반 이름(common name)이 유효한지 확인함. 브라우저가 인증서를 신뢰할 경우 서버의 공개 키를 사용해 대칭 세션 키를 생성, 암호화한 후 다시 전송함.
- 서버 서버의 개인 키를 사용해 대칭 세션 키를 해독(복호화)하고 세션 키로 암호화된 승인을 회신하여 암호화된 세션을 시작함.
- 서버와 브라우저가 이제 전송되는 모든 데이터를 세션 키로 암호화함.
좀 더 자세히 알아보는 SSL/TLS handshake 프로세스
아래 링크의 내용을 확인하자.
https://www.cloudflare.com/ko-kr/learning/ssl/what-happens-in-a-tls-handshake/
- 'client hello' 메시지
- 클라이언트가 서버로 "hello" 메시지를 전송하면서 핸드셰이크를 개시한다.
- 메시지 정보
- 클라이언트가 지원하는 TLS 버전
- 지원되는 암호 제품군
- "client random"라고 하는 무작위 바이트 문자열이 포함
- 'server hello' 메시지
- 클라이언트 헬로 메시지에 대한 응답으로 서버가 메시지를 전송한다.
- 메시지 정보
- 서버의 SSL 인증서(서버에서 생성한 공개키 포함)
- 서버에서 선택한 cipher suite,
- 서버에서 생성한 또 다른 무작위 바이트 문자열인 "server random"
- 인증 Authentication
- 클라이언트가 서버의 SSL 인증서를 인증서 발행 기관을 통해 검증한다.
- 이를 통해 서버가 인증서에 명시된 서버인지, 클라이언트가 상호작용 중인 서버가 실제 해당 도메인의 소유자인지를 확인한다.
- The premaster secret
- 클라이언트가 "The premaster secret"라고 하는 무작위 바이트 문자열을 하나 더 전송한다.
- The premaster secret는 공개 키로 암호화되어 있으며, 서버가 개인 키로만 해독할 수 있다.
- (클라이언트는 서버의 SSL 인증서를 통해 공개 키를 받는다.)
- 개인 키 사용
- 서버가 The premaster secret를 해독한다.
- 세션 키 생성
- 클라이언트와 서버가 모두 client random, srver random, premaster secret를 이용해 세션 키를 생성한다.
- 모두 같은 결과가 나와야 한다.
- 클라이언트 준비 완료
- 클라이언트가 세션 키로 암호화된 "완료" 메시지를 전송한다.
- 서버 준비 완료
- 서버가 세션 키로 암호화된 "완료" 메시지를 전송한다,
- 안전한 대칭 암호화 성공
- 핸드셰이크가 완료되고, 세션 키를 이용해 통신이 계속 진행된다.
4.2 세션
- 세션은 실제로 서버와 클라이언트가 데이터를 주고받는 단계
- SSL 은 암호화된 데이터를 전송하기 위해 대칭키와 공개키를 혼합해서 사용한다.
- session key(대칭키)는 공개키 방식으로 암호화
- 실제 데이터는 session key 값을 이용해서 대칭키 방식으로 암호화
대칭키와 공개키를 조합해서 사용하는 이유?
- 공개키 방식은 많은 컴퓨팅을 사용하여 공개키를 그대로 사용하면 비용이 증가함
- 암호화되지 않은 인터넷을 통해 대칭키를 그대로 전송하는 것도 위험
- 따라서 공개키 방식으로 대칭키를 암호화하고, 실제 데이터는 대칭키를 통해 주고받음
4.3 세션 종료
- 데이터 전송 완료 후 SSL 통신 종료
- 대칭키인 Session Key 폐기
5. SSL 인증서
- 사용자가 서버의 진위 및 전송되는 데이터의 암호화를 확인할 수 있는 서버 인증서
- SSL은 SSL 인증서(공식적으로 "TLS 인증서")가 있는 웹사이트만 실행 가능하다.
- 일종의 신분증이나 배지와 같다.
- SSL 인증서에는 웹사이트 공개 키가 있다.
- 클라이언트는 SSL인증서에 포함된 웹서버의 공개키를 사용해 클라이언트의 Pre Master Secret 키를 암호화하여 웹서버에 전달한다.
- 다시 웹서버는 개인키로 Pre Master Secret로 복호화한다.
- 클라이언트와 서버가 session key를 생성하고 이제 session key 즉 대칭 키로만 데이터를 주고받는다.
- 공개키로 암호화된 데이터는 웹서버에 저장된 개인키로만 해독 가능하다. 그 반대도 마찬가지
- CA(인증 기관)는 SSL 인증서 발행을 담당한다.
- Comodo, Symantec, GoDaddy, GlobalSign, Digicert, Letsencrypt 등
5.1 도메인에 따른 SSL 인증서 유형
- 도메인에 따른 다양한 유형의 SSL 인증서가 존재
단일 도메인 SSL 인증서
- 단 하나의 도메인에 적용
- www.naver.com 도메인으로 인증한다면 www.naver.com, naver.com 만 인증 가능
- naver.com 도메인으로 인증한다면 naver.com 만 인증 가능
와일드카드 SSL 인증서
- 여러 하위 도메인을 보호하기 위해 사용하는 인증서
- www.cloudflare.com, blog.cloudflare.com, developers.cloudflare.com 인증 가능
멀티 도메인 SSL 인증서
- 다수의 도메인 인증 가능
5.2 심사 수준에 따른 인증서 종류
Domain Validation (DV) 도메인 유효성 검사
- 가장 기본적인 수준의 SSL 인증서
- 기업의 도메인 이름 소유권만 검증
Organization Validation(OV) 조직 유효성 검사
- 도메인 소유권 및 도메인 뒤에 존재하는 조직을 검증하는 일종의 SSL 인증서
- CA가 담당자나 기업에 인증서를 직접 문의
Extended Validation(EV) 확장 유효성 검사
- 가장 포괄적인 형태의 보안 인증서.
- 기업, 조직을 완전히 검사한 후에 SSL 인증서를 발행 가능
5.3 SSL 인증서에 포함된 정보
- 도메인 네임
- 어떤 사람, 조직 또는 기기에 발급되었는지
- 인증서를 발급한 인증 기관
- 인증 기관의 디지털 서명
- 연결된 하위 도메인
- 인증서 발급일
- 인증서 만료일
- 공개 키(개인 키는 비밀로 유지됨)
마치며
- SSL/TLS 는 정보를 암호화해서 송수신하는 프로토콜이다.
- 인터넷 통신 간의 전송되는 정보를 보호하는 역할을 한다.
- 서로 자신을 신뢰할 수 있음을 알리기 위해 전자 서명이 포함된 인증서를 사용하며, 통신 내용을 암호화한다.
- 주요 웹브라우저 주소창에 자물쇠 아이콘이 뜨는 것으로 TLS의 적용 여부를 확인할 수 있다.
- 통신에는 핸드셰이크 -> 전송 -> 세션 종료 과정을 거친다.
- SSL/TLS 은 암호화된 데이터를 전송하기 위해 대칭키와 공개키를 혼합해서 사용한다.
참고
- https://www.digicert.com/kr/what-is-ssl-tls-and-https
- https://www.digicert.com/kr/what-is-an-ssl-certificate
- https://www.digicert.com/kr/how-tls-ssl-certificates-work
- https://www.cloudflare.com/ko-kr/learning/ssl/what-is-ssl/
- https://www.cloudflare.com/ko-kr/learning/ssl/transport-layer-security-tls/
- https://opentutorials.org/course/228/4894
- https://aws-hyoh.tistory.com/11
- https://aws-hyoh.tistory.com/39
- https://namu.wiki/w/TLS
- https://wayhome25.github.io/cs/2018/03/11/ssl-https/
- https://goodgid.github.io/TLS-SSL/