[네트워크] HTTPS, TLS/SSL, 인증서 갱신, acme

kicksky 2022. 5. 14. 22:07

얼마 전에 브라우저(클라이언트)와 서버 간의 데이터 교환에 관한 글을 읽으면서 잠깐 네트워크 공부를 했는데 머릿 속에서 흩어져있던 지식들이 조금은 맥락을 구성한 것 같아서 기록으로 남겨놓고자 한다.

 

TCP + TLS

브라우저에서 어떤 URL을 입력해서 서버에 요청하는 과정 중 (DNS는 뛰어넘고) navigation 단계에서 TCP 연결이 이루어진다. 클라이언트와 서버 간에 3-way handshaking이 오고 감으로써 세션이 성립되며, 이는 이제 "네트워크를 통해 메세지를 교환"(전송 계층) 할 수 있다는 뜻이다. 그러고 나서 필요한 경우에는 TLS negotiation이 이루어진다. 필요한 경우란 암호화된 데이터 교환을 위해 HTTPS 프로토콜로 통신을 하는 경우에 해당한다. 이 과정을 대략적으로 보면 서버의 SSL 인증서로 암호화된 세션 키를 클라이언트와 서버가 공유하고 식별하는 식이다.

 

TLS와 HTTPS

그 전까지는 HTTP보다 HTTPS가 더 안전한 연결을 한다는 것과 HTTPS 연결을 위해서는 인증서를 발급 받아야 한다는 것, 이 두 가지 지식만 갖고 있었다. 이 지식의 영역에 그 인증서로 뭘 어떻게 한다는 건지에 대한 내용은 없어서 좀 막연했다. 그런데 TLS와 SSL을 머릿 속에 넣으니 클라이언트와 서버 간의 연결에 대한 그림이 더 선명해졌다. TLS(Transport Layer Security) 위에서 보안이 갖추어진 HTTP 통신이 일어나는 것이 HTTPS.

 

인증서 갱신

이와 더불어 몇달 전에 직접 인증서를 다루었던 기억도 같이 떠올랐다. EC2 서버를 띄워서 사용 및 관리 중인 사내 업무 관련 어플리케이션이 있는데, 이 서버의 인증서 만료 기한이 지나서 내가 직접 갱신한 적이 있다. 사실 처음에는 뭐가 뭔지도 모르고 그냥 인증서 갱신하라고 하니까 문서 보고 따라했는데 이제야 내가 그 때 뭘 한 건지 이해가 된다. 클라이언트에서 서버로부터 인증서를 받긴 했는데 인증서가 만료되었으니까 얘랑은 통신 못하겠다고 문 닫은 것이었다. 그럼 그냥 HTTP로 통신하면 안 되나? 하는 생각이 들었는데 애초에 HTTPS로 요청을 하니까 당연히 안되는 듯(...). 인증서 발급을 직접 하지는 않았는데 지금 찾아보니까 무료로 간단히 할 수 있는 것 같다. 

 

ACME

갱신은 acme.sh로 했다. 지금 보니 acmeAutomated Certificate Management Environment의 약자이고, 말 그대로 인증서의 발급과 갱신을 자동화하는 프로토콜이다. 일반적인 경우에는 dns api mode로, 도메인의 TXT 레코드를 수정할 수 없는 DNS api를 사용하는 경우에는 dns alias mode로 설정함으로써 자동화가 이루어지는 것 같다. 도메인 프로바이더가 DNS api를 제공하지 않는 경우에 매번 직접 갱신해야하는 듯.

 

 

 


​https://dev.to/arikaturika/how-web-browsers-work-part-2-with-illustrations-1gn5

https://www.digicert.com/kr/what-is-ssl-tls-and-https