사용자를 클라이언트, 웹서비스를 서버라고 하자.
클라이언트와 서버가 네트워크를 이용해서 통신을 할 때
내부적으로 3가지 단계가 일어난다.
이 과정을 통해 SSL이 어떻게 데이터를 암호화해서 전달하냐면
1. 악수 (Handshake)
2. 세션(데이터 송수신)
3. 세션종료
- Client Hello / 클라이언트가 서버에 접속한다.
- Server Hello / Client Hello에 대한 응답으로 Server Hello를 한다.
- Client의 인증서 확인 및 대칭 키를 공개키로 암호화해서 전달
/ 클라이언트는 서버로 부터 받은 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA 리스트를 확인한다.- Server가 비공개키로 복호화해서 대칭 키를 전달 받음
비대칭키로 암호한다면 데이터를 안전하게 전달할 수 있지만
매 통신 시마다 한다면 너무 많은 자원과 시간을 사용해야 한다.
따라서, 비대칭키보다 더 적은 컴퓨터 자원을 이용하는 대칭키 방식을 이용해야 한다.
대칭키를 이용해서 속도는 빠르게 하되, 대칭키를 안전하게 전달해야 한다.
-> 대칭키를 비대칭키 기법을 이용해서 전달하면 가능
즉, 클라이언트가 공개키를 이용해서 대칭키를 암호화 시킨다.
그러면 특정 암호문이 나오는데 이 암호문을 서버에 전달한다.
그렇다면 대칭키는 어떻게 만드나.
클라이언트와 서버가 생성해서 전달한 랜덤 데이터를 혼합해서 하나의 데이터로 만든다. (Pre master secret키 라고도 한다.)
이 값을 대칭키로 사용한다.
이 대칭키를 서버의 공개키를 이용해서 암호화 한 다음 서버에게 전송한다.
이로써 Client의 인증서 확인 및 비밀 키 전달 과정이 끝난다.
이제 서버는 클라이언트가 전송한 암호문을 이제 비공개키로 복호화 한다.
그러면 대칭키를 얻게 된다.
그러면 이 대칭키를 가진 것은 클라이언트와 서버 뿐이므로, 서로를 신뢰하게 된다.
앞으로 이 값을 이용해서 서버와 클라이언트는 대칭키 방식으로 암호화 한 뒤 서로 주고 받을 수 있다.
클라이언트와 서버는 핸드쉐이크 단계의 종료를 서로에게 알린다.
-> 이제 데이터를 주고 받을 준비가 되었음을 서로에게 알리는 것.
따라서 앞으로 정보를 상대방에게 전송하기 전에 세션 키로 암호화한다.
그리고 정보를 받은 사람도 세션 키를 가지고 있으므로 복호화 할 수 있다.
이로써 SSL은 보안적으로 전송할 수 있게 된다.
데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려주게 된다.
그리고 통신에서 사용한 대칭키인 세션키를 폐기하게 된다.