-
Https는 공개키? 대칭키? 비대칭키?네트워크/네트워크 정리 2020. 4. 3. 01:37
공개키와 비대칭키를 혼용해서 쓰는 걸로 알고 있고 두 개 다 같은 말이라고 생각하고 글을 쓰겠다.
Https 관련 글들을 보면 공개키를 통해 평문을 암호화 복호화한다고 되어있고 어느 글들은 공개키(비대칭키) + 대칭키
를 같이 사용하고 있다고 쓰여있다. 따라서 https의 통신 흐름을 좀 더 살펴보았다.
우선 CA기관과 인증서에 대해서 간략하게 알아보자.
인증서는 로컬로 내가 만들 수 있는 인증서 ( 사설 인증서 ) CA 기관에서 만든 인증서가 있다. ( 공인 인증서 )
브라우저가 이미 인증서를 발급하는 기관들의 public 키를 알고있는 것.
내가 만든 인증서는 public키가 없고. 따라서 빨간색과 함께 warning이란 글이 보이는 것이다.
암호화 복호화 알고리즘은 대칭키 비대칭키가 있게 되는데 대칭키는 암호화,복호화에 똑같은 키를 쓰고
비대칭키는 암호화,복호화에 다른 키를 쓰는 것이다.
비대칭키는 어떤 텍스트를 pub키로 암호화하면 pri키로 풀 수 있다. 혹은 반대로 pri키로 암호화하면 pub키로 풀 수 있다.
다음은 대칭키와 비대칭키의 장단점 들이다.
대칭키는 비대칭키보다 빠르다. 단점은 대칭키가 노출이 됐을 때 위험하다. 암호화된 텍스트를 풀어 볼 수 있으니
비대칭키는 단점으로는 암호화 복호화에 CPU를 사용해야 하고 장점은 안전하다. pub키가 노출이 돼도 private key로만복호화를 할 수 있기에 안전하다.
따라서 조금 더 자세한 HTTPS 통신 흐름
사실 https는 대칭키와 공개키(비대칭키) 두 개를 교묘하게 이용해서 쓰고 있는 것이 https이다.
결론부터 말하자면 handshaking 과정에 비대칭키를 써서 인증서(대칭키)를 보내고 이 인증서에 대칭키를 안전하게
받았다면 연결 이후에는 대칭키를 사용해서 전달하게 된다.
클라이언트가 서버에게 연결을 요청하면 서버는 클라이언트에게 서버에 대칭키를 보내준다. 그리고
인증서가 신뢰할 수 있는 웹사이트에서 인증받은 것인지 확인한다. 인증 기관에서 받은 것이 아닌
사설 인증서라면 warning이 뜨게 된다. 공인된 인증기관에서 받은 인증이거나 warning에 동의하게 되면
이제 서버가 준 대칭키로 세션 키를 암호화한다. 그 후 암호화 한 텍스트를 서버에 보내게 된다.
그러면 세션 키는 그대로 있고 세션 키를 암호화한 텍스트가 넘어가게 됩니다.
세션 키를 암호화한 텍스트가 서버로 가면 서버에서는 private key 풀어서 세션 키가 이거구나 알게 되는 것.
이제 브라우저와 서버가 같은 키를 가지고 더 이상 비대칭키(공개키)로 할 필요가 없다. 여기까지 handshaking 끝
이후는 대칭키 방식으로 동작한다.
그러면 왜 더 이상 비대칭키를 계속 사용하지 않고 handshaking 이후에는 대칭키를 사용하는 걸까?
서버에서 암호화 복호화하는데 비대칭키는 시간이 너무 오래 걸리는 것. 세션이 긴 소통방식에서는 좋은 방식이
아니다.
즉 https는 결국엔 대칭키를 쓰는 것이고 쌍방이 가지고 있는 세션 키로 암호화하고 복호화한다는 것
https를 써도 성능이 오래 걸리지 않는 까닭은 사실은 대칭키 방식으로 동작하기 때문이다.
정리:
1. TCP 3 way HandShake 이후
2. 클라이언트는 서버에게 지원 가능한 방식을 알리고 서버는 클라이언트에게 알리게 된다.
3. 서버는 공개키가 포함된 서버 인증서를 클라이언트에게 발송한다.
4. 클라이언트는 전송받은 서버 인증서에 대해 신뢰 기관 발급 여부를 확인하고 암호화키로 사용될 세션 키를
랜덤으로 생성하여 공개키로 암호화해서 암호화된 텍스트 파일을 서버로 전송한다.
5. 서버는 자신의 개인키로 클라이언트에게 전송받은 파일을 복호화한다.
6. 이제 클라이언트와 서버는 모두 동일한 세션키 ( 대칭키 )를 공유하게 된다.
7. 이제 데이터 전송 시 대칭키인 서로 공유된 세션키로 암호화된 전송이 시작된다.
https://tiptopsecurity.com/how-does-https-work-rsa-encryption-explained/
https://opentutorials.org/course/228/4894
'네트워크 > 네트워크 정리' 카테고리의 다른 글
REST API의 이해와 설계 (0) 2020.09.07 OAuth2 인증 방식 정리 (0) 2020.05.13 Get과 Post의 차이 (1) 2020.02.05 TCP 3 way handshake & 4 way handshake (0) 2020.01.29 웹에서의 쿠키와 세션 (0) 2020.01.18