Secure Socket Layer의 약자로 애플리케이션 암호화 프로토콜이다. TLS는 SSL 버전이 올라가며 이름이 바뀐 것이라고 보면 된다.
즉 SSL 과 TLS는 같은 것을 의미하는 단어이며 이 글에서는 편의상 SSL로 표현한다.
SSL은 암호화, 해시화, 디지털 인증서 라는 3가지 기술을 조합해 사용한다.
데이터를 암호화 하여 만약 누군가 데이터를 도청하더라도 그 내용을 알 수 없게 한다.
데이터로부터 정해진 해시 함수에 기반해 해시 값 을 추출하여 데이터가 변조됨을 감시한다.
디지털 인증서를 사용해 해당 단말이 진짜임을 증명한다. 이를 통해 신분 위조를 방지할 수 있다.
SSL에서는 데이터를 암호화하는데, 이 때 크게 공통 키 암호화 방식과 공개키 암호화 방식 두 가지 방식이 있다.

공통키 암호화 방식은 암호화 키와 복호화 키로 같은 키를 사용하는 암호화 방식이다. 즉, 클라이언트와 서버가 통신 시 암호화 된 데이터를 복호화하기 위해선 같은 키를 공유하고 있어야 한다.
장점으로는 구조가 단순하기 때문에 처리 속도가 빠르다.
그러나 공유를 위해선 암호화 키를 보내는 과정이 필요하고 동시에 보내는 중간에 키가 탈취당할 수 있는 문제가 있다.

공개키 암호화 방식은 암호화 키와 복호화 키가 다르다.
장점으로는 공개키를 공유하기 때문에 보여줘도 상관이 없고 비밀 키만 서버에서 잘 관리하면 된다.
단점은 암호화, 복호화 처리에 시간이 더 소요되어 처리 속도가 느리다.
SSL에서는 공통키와 공개키 방식을 적절히 혼합하여 사용한다. 간단한 흐름을 설명하면,
- 웹서버는 공개키와 비밀키를 만든다.
- 웹서버는 공개키를 모두에게 공개하고 비밀키만 보관한다.
- 웹 브라우저는 공통키의 재료를 공개키로 암호화하여 보낸다.
- 웹서버는 공통키의 재료를 비밀키로 복호화한다.
- 웹서버와 웹 브라우저는 공통키의 재료로부터 공통키를 생성한다.
- 웹 브라우저는 애플리케이션 데이터를 공통키로 암호화한다.
- 웹서버는 애플리케이션 데이터를 공통키로 복호화한다.
즉 공통키 재료를 공개키 방식으로 공유하고 애플리케이션 데이터는 공통키 재료로 생성한 공통키로 암호화하여 보낸다.
여기서 해시화는 단방향 해시 함수를 사용하여 데이터를 해싱하는 것을 말한다. 데이터가 달라지면 데이터 해시 값도 달라지기 때문에 데이터의 변조 여부를 검사할 수 있고 해시 값으로 원본 데이터를 복원할 수 없기 때문에 보안상으로도 안전하다.
SSL에서는 해시화를 애플리케이션 데이터 검증, 디지털 인증서 검증에 사용하는데,
애플리케이션 데이터와 함께 해시값을 전송하고 받은 서버에서 데이터를 해싱하여 해시 값을 비교하는 형태이다.
디지털 인증서 검증은 디지털 서명에 해시화를 사용하여 값이 변조되지 않았음을 검증한다.
SSL을 사용하기 위해서는 서버 인증서가 필요하다. 인증서를 발급받는 자세한 방법은 구글링! 여기서는 인증서가 있다고 가정하고 다음으로 넘어간다.
서버에 인증서를 설치한 뒤, SSL 접속을 하기 전 SSL 핸드셰이크 과정을 갖는다. TCP 3웨이 핸드셰이크로 TCP 커넥현을 연 뒤, 핸드셰이크 레코드를 이용해 SSL 핸드셰이크를 한다. 이 때 SSL 핸드셰이크는 대응 방식 제시, 통신 상대 증명, 공통키 재료 교환, 최종 확인 단계로 이루어진다.

Client Hello 핸드셰이크 레코드를 사용해 웹 브라우저가 사용할 수 있는 암호화 방식이나 단방향 해시 함수를 제시
통신 상대 증명
2-1 Server Hello : 사용할 암호화 방식과 해시 함수 등과 더불어 SSL이나 HTTP 버전, random number 등을 반환한다.
2-2 Certificate : 자신의 서버 인증서를 보내고 이를 증명한다.
2-3 Server Hello Done : 서버가 필요한 정보를 다 보냈음을 알리고 클라이언트는 서버 인증서를 검증한다.
클라이언트에서 공통키 재료로 사용되는 프리 마스터 시크릿을 만들어 서버로 보낸다.
그 다음 client random, server random을 섞어 마스터 시크릿을 만든다.
마스터 시크릿을 사용하여 애플리케이션 데이터 암호화에 사용하는 세션키와 해시화에 사용하는 MAC 키를 만들어낸다.
이후 서버로 프리 마스터 시크릿을 보내고 서버에서도 이를 이용해 마스터 시크릿과 세션키, MAC 키를 만들어낸다.
서로 Change Cipher Spec과 Finished를 교환하고 핸드셰이크를 종료한다. 종료되면 SSL 세션이 만들어지고 애플리케이션 데이터 암호화 통신을 시작한다.
이렇게 SSL 암호화 통신을 시작하면, 애플리케이션 데이터를 MAC 키로 해시화한 뒤, 세션키로 암호화하여 애플리케이션 데이터 레코드로 전송한다.
SSL 세션 재이용
연결 과정에서 알 수 있듯이, SSL 핸드셰이크는 디지털 인증서를 보내거나 공통키의 재료를 보내는 등 처리하는데 시간이 오래 걸린다.이에 최초의 SSL 핸드셰이크에서 생성한 세션 정보를 캐시해서 사용하는 SSL 세션 재이용 기능을 활용하여 Certificate, Client Key Exchange 등의 공통키 생성 과정을 생략하여 성능을 높일 수 있다.
통신이 끝나면 SSL 세션을 닫는다. 세션을 닫을 때는 웹 브라우저 혹은 서버에 관계없이 종료하고 싶은 측에서 close_notify를 송출하고 그 뒤 TCP 4웨이 핸드셰이크하고 TCP 커넥션을 종료한다.