HTTPs사용시 SSL/TLS Handshake 과정(feat. tcp 3-way handshake)
HTTPS의 ssl/tls이 어떻게 동작하는지 원리를 알고싶어서 공부하게되었다. 사실 EC2가 아니더래오 어덯게 동작하는지 알면좋다고생각했다.
HTTP와 HTTPS는 무엇이 다르고 HTTPS는 뭐였지? -> Https는 secure이니 http에 보안을 더한거지-> 그래서 무슨 보안을 더한건데? 보안넣고 통신하는거랑 안하고하는거랑 무슨차이인데? ssl인증서는 뭐야?
이렇게 꼬리에 꼬리름 물어가며 생각하게되었던거같다. 그리고 찾아가면서 참 재미있는 주제로 공부했다고 생각도든다.
추후에 내가 머리로 해당 원리를 머리에 그려갈때쯤, 제일 정확하게 확고하고 쉽게 설명한 글을 발견하였다.
https://nuritech.tistory.com/25#google_vignette
HTTPS 통신 원리 쉽게 이해하기 (Feat. SSL Handshake, SSL 인증서)
이 글을 쓰게 된 이유는,, 나의 평소 HTTPS 에 대한 지식은 HTTPS 가 암호화된 네트워크 통신 프로토콜이고 HTTPS 를 사용한 네트워크 통신에서는 주고받는 패킷을 까도 데이터가 암호화되어 있어 안
nuritech.tistory.com
HTTPS이전에 TCP 통신커넥트를 간략히 보여주고 SSL처리과정에 대해서 설명하는데
먼저 TCP 통신할기위해서 3-way handshake를 하는데
1. 클라이언트 -> 서버로 Sync 패킷보냄
2. 이를 받은 서버 -> 클라이언트 ACK + Sync 패킷 보냄
3. 이를 받은 클라이언트 -> 서버 ACK 패킷을 보냄으로써 TCP기반 통신이 완료된다.
이 이후에 HTTPs가 이루워지는데
여기서 SSL handshake의 목적성을 먼저 알아야한다. 왜 SSL handshake를 하느냐?
1. 주고받을 데이터를 어떤 암호화 알고리즘을 쓸지 협의해야한다.
2. 클라이언트와 서버가 데이터 암호화에 쓰일 대칭키를 공유해야한다.
말그대로 데이터를 암호화해서 서로 주고받고 암호화/복호화해야하는데 어떤 알고리즘을 쓰는지도 모르고 만약 그 알고리즘을 쓴다고했을때 그걸 복호화할수있는 키(세션키)를 어떻게 그럼 서로에게 넘겨주느냐가 관건이다. 그냥 넘겨준다면 보안의 문제로 인해 이것마저도 방법이 필요하기때문이다. 그래서 데이터를 주고받기전에 SSL handshake과정이 이루워지는것이다.
이때 사용하는 방식이 비대칭키(공개키+비공개키) + 대칭키(공개키, 서로같은 공개키) 암호화방식을 사용한다. 이 비대칭키는 무엇이고 대칭키는 무엇인지 아래에 좀더 추가로설명하겠다.
SSL/TLS Handshake 과정

참고로 SSL 은 구버전이고 현재는 대부분 TLS 을 사용한다고함
1. Client Hello: 먼저 클라이언트가 서버로 요청을 보낼때 자신이 사용할수있는 암호화 알고리즘 리스트를 패킷에 담아 보낸다.
2. Certificate: 서버는 이패킷을 받고 클라이언트가준 목록중 사용할 알고리즘 정보를 담은 패킷(Server Hello)과CA를 통해 얻은 SSL인증서 패킷을 클라이언트에게 보낸후 끝냈음을 알린다(Server Hello Done). 이때 SSL인증서에는 비대칭키에 쓰이는 공개키정보, 만료일, 서명정보 등을 담고있다.
2-1. Server Exchage: 만약 Certificate에 공개키정보가없다면 서버가 직접 공개키를 전달하고 그게아니라면 스킵
3. SSL인증서를 받은 클라이언트(브라우저)는 해당 인증서가 신뢰할수있는지 검증을 거친다. 이때 검증은 각 브라우저마다 인증기관,CA(Certificate Authority)리스트들이 있다고한다. 이를 통해 신뢰할수있는 인증인지를 검증을한후 검증이 완료가 되면 이제 서로 사용하기로한 암호화알고리즘을 이용한 세션키(대칭키)를 서버쪽에 보내준다. 근데 이걸 보낼때 그냥보내면 탈취했을때 그냥 사용할수있기때문에 탈취하더래도 복호화할수있는 사람만 쓸수있도록하기위해서 아까 서버가 보내준 비대칭키의 공개키를 해당 대칭키(세션키)를 암호화해서 보내준다.
4. Change Cipher Specs: 이제 데이터를 암호화하여 보내라고 요청후 끝낸다(finshed)
5. 서버는 공개키로 암호화된 대칭키(세션키)를 자신이 가지고있는 비공개키로 대칭키를 복호화한다.
6. Change Cipher Specs: 클라이언트에게 똑같이 데이터를 암호화하여 보내라는요청후 끝낸다(finished)
7. 이제 서로 데이터암호화하는데 사용할 대칭키를 가지고있기때문에 Https 사용 준비를 끝내고 이제 데이터를 주고받는다.
여기서 이제 비대칭키와 대칭키가 무엇인지 간략하게 얘기해보면
비대칭키 암호화
비대칭키는 말처럼 대칭하지않은 비대칭하다는 뜻을 가진다. 공개키와 비공개키를 통해 암호화를한다면 한쪽은 공개키 한쪽은 비공개키를 가지고있기때문에 결국 비대칭하다는 뜻이다.
이때 공개키는 클라이언트에서 가지고있고 비공개키는 서버에서 가지고있는다, 공개키는 많은 클라언트가 있기때문에 누구든 암호화하는데 사용할수있도록 제공하는것이고 비공개키는 결국 그걸 복호화할수있는건 오직 서버뿐이기때문에 서버만이 가지고있는것이다.
대칭키 암호화
이제 반대로 대칭키는 서로 같은 키를 가지고있는걸 말한다. 클라이언트가 서버로 서버가 클라이언트로 데이터를 보낼때 서로 같은 키를 가지고있어야 이를 해독/복호화할수 있기때문에 서로 같은걸 가지고있어야한다.
여기까지 설명을 하면 결국 SSL Handshake는 대칭키를 주고받기위한 행위, 그리고 그 대칭키가 어떤알고리즘을 쓸건지 정하는 공유가 주목적이되는거다. 그래서 데이터를 보내기전에 대칭키를 서로 공유하기위해서 서버가 제공한 비대칭키를 통해 클라이언트는 대칭키를 암호화해서 서버에게 보내주고 이를 서버가 비공개키로 해독하는 과정인것이다.