Https 통신과정, TCP/IP 핸드 쉐이킹 과정
- http는 서버에 데이터 전송시 암호화되지 않은 방법으로 전송하기 때문에
비밀번호 계좌번호 등 중요한 데이터를 서버로 전송하는 경우 https를 사용하여 통신 권장
* https는 ssl 프로토콜을 기반으로 동작하는 프로토콜이다.
* ssl 인증서란 클라이언트와 서버간 통신을 제 3자가 보증해주는 문서이다.
클라이언트가 서버에 접속한 직후 서버가 클라이언트에 인증서 전달 -> 클라이언트는 이 인증서를보고
신뢰할 수 있는 서버인지 확인 후 데이터 전송등 다음절차 수행
* ssl 사용시 장점
1. 전달되는 내용이 다른사람에게 노출되는 것을 막음
2. 클라이언트가 접속하려는 서버가 신뢰할 수 있는 서버인지 확인가능
3. 전달되는 내용이 변조되는 것을 막음
* ssl에서 사용하는 암호화의 종류
1. 대칭키
2. 공개키
* 대칭키
한개의 키로 암호화, 복호화에 같은 키를 사용.
예시) 1234로 암호화 -> 1234로 복호화 가능
따라서 키를 모른다면 복호화 불가능
-단점 : 키 자체를 주고받을때 탈취된다면 해커는 해당키로 복호화 가능.
* 공개키 (예시: RSA 공개키)
두개의 키를 사용. private key / public key
private key는 자신만 가지고, public key를 공개한다.
public key로 암호화된 데이터는 private key로 복호화가 가능하다.
반대로 private key로 암호화된 데이터는 public key로 복호화가 가능하다.
데이터 전송 전 클라이언트는 서버로부터 private key로 암호화된 정보를 받아 public key로 복호화를 진행하여
서버의 신원을 확인하고, 데이터를 public key로 암호화하여 서버로 전송한다. (이것이 전자 서명)
서버는 해당 데이터를 private key로 암호화하여 사용가능하다.
이 신원확인 과정이 SSL handshake 이다.
CA(Certificate authority) : 인증기관
SSL을 통해 암호화된 통신을 제공하려는 서비스는 인증서를 여기서 구입해야함
인증서는 CA의 private 키로 암호화 됨
인증서의 데이터
- 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
- 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)
브라우저에는 이미 CA의 리스트와 공개키를 가지고 있다 (없으면 인증 불가)
웹 브라우저가 서버에 접속할 때 서버는 제일 먼저 인증서를 제공한다. 브라우저는 이 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지를 확인한다. 확인 결과 서버를 통해서 다운받은 인증서가 내장된 CA 리스트에 포함되어 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다.
컴퓨터와 컴퓨터가 네트워크를 이용해서 통신을 할 때는 내부적으로 3가지 단계가 있다.
악수 -> 전송 -> 세션종료
* SSL은 대칭키/공개키 혼합하여 사용
- 실제 데이터 : 대칭키
- 대칭키의 키 : 공개키
공개키 방식의 암호화는 매우 많은 컴퓨터 자원을 사용하기 때문.
반면에 암호화와 복호화에 사용되는 키가 동일한 대칭키 방식은 적은 컴퓨터 자원으로 암호화를 수행할 수 있기 때문에 효율적.
하지만 수신측과 송신측이 동일한 키를 공유해야 하기 때문에 보안의 문제가 발생
실제 통신과정
1. Client Hello : 클라이언트가 브라우저나 다른 TCP 통신으로 서버에 접속함.
- 전송하는 정보
- 클라이언트 측에서 생성한 랜덤 데이터
- 클라이언트가 지원하는 암호화 방식 : 클라이언트와 서버가 지원하는 암호화 방식이 서로 다를 수 있기 때문
- 세션 아이디 : 이미 SSL 핸드쉐이킹을 했다면 비용과 시간을 절약하기 위해서 기존 세션을 재활용하게 되는데 이 때 사용할 연결에 대한 식별자를 서버 측으로 전송.
2. Server Hello: 위에대한 응답을 함
- 전송하는 정보
- 서버에서 생성한 랜덤한 데이터
- 클라이언트가 지원가능한 암호화 방식에 맞추어 현재 서버에서 제공할수 있는 가장 안전한 암호화 방식
- 인증서
3. 클라이언트는 서버의 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해 내장된 CA 리스트를 확인.
CA 리스트에 인증서가 없다면 사용자에게 경고 메시지를 출력.
인증서가 CA에 의해서 발급된 것인지를 확인하기 위해 내장된 CA의 공개키를 이용해서 인증서를 복호화.
복호화에 성공했다면 인증서는 CA의 개인키로 암호화된 문서임이 암시적으로 보증된 것.
인증서를 전송한 서버를 믿을 수 있게 된 것
클라이언트는 상기 2번을 통해서 받은 서버의 랜덤 데이터와 클라이언트가 생성한 랜덤 데이터를 조합해서
pre master secret라는 키를 생성.
이 키는 세션 단계에서 데이터를 주고 받을 때 암호화하기 위해서 사용될 것이다.
이 때 사용할 암호화 기법은 대칭키이기 때문에 pre master secret 값은 제 3자에게 절대로 노출되어서는 안됨!
그럼 문제는 이 pre master secret 값을 어떻게 서버에게 전달할 것인가이다. 이 때 사용하는 방법이 바로 공개키 방식이다. 서버의 공개키로 pre master secret 값을 암호화해서 서버로 전송하면 서버는 자신의 비공개키로 안전하게 복호화 할 수 있다. 그럼 서버의 공개키는 어떻게 구할 수 있을까? 서버로부터 받은 인증서 안에 들어있다. 이 서버의 공개키를 이용해서 pre master secret 값을 암호화한 후에 서버로 전송하면 안전하게 전송할 수 있다.
- 서버는 클라이언트가 전송한 pre master secret 값을 자신의 비공개키로 복호화한다. 이로서 서버와 클라이언트가 모두 pre master secret 값을 공유하게 되었다. 그리고 서버와 클라이언트는 모두 일련의 과정을 거쳐서 pre master secret 값을 master secret 값으로 만든다. master secret는 session key를 생성하는데 이 session key 값을 이용해서 서버와 클라이언트는 데이터를 대칭키 방식으로 암호화 한 후에 주고 받는다. 이렇게해서 세션키를 클라이언트와 서버가 모두 공유하게 되었다는 점을 기억하자.
- 클라이언트와 서버는 핸드쉐이크 단계의 종료를 서로에게 알린다.
2. 세션
세션은 실제로 서버와 클라이언트가 데이터를 주고 받는 단계이다. 이 단계에서 핵심은 정보를 상대방에게 전송하기 전에 session key 값을 이용해서 대칭키 방식으로 암호화 한다는 점이다. 암호화된 정보는 상대방에게 전송될 것이고, 상대방도 세션키 값을 알고 있기 때문에 암호를 복호화 할 수 있다.
그냥 공개키를 사용하면 될 것을 대칭키와 공개키를 조합해서 사용하는 이유는 무엇을까? 그것은 공개키 방식이 많은 컴퓨터 파워를 사용하기 때문이다. 만약 공개키를 그대로 사용하면 많은 접속이 몰리는 서버는 매우 큰 비용을 지불해야 할 것이다. 반대로 대칭키는 암호를 푸는 열쇠인 대칭키를 상대에게 전송해야 하는데, 암호화가 되지 않은 인터넷을 통해서 키를 전송하는 것은 위험하기 때문이다. 그래서 속도는 느리지만 데이터를 안전하게 주고 받을 수 있는 공개키 방식으로 대칭키를 암호화하고, 실제 데이터를 주고 받을 때는 대칭키를 이용해서 데이터를 주고 받는 것이다.
3. 세션종료
데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 대칭키인 세션키를 폐기한다.
참고
https://opentutorials.org/course/228/4894#session