1. HTTPS ( HTTP Secure )

HTTP는 간단한 프로토콜이므로 그 나름대로의 장점이 있었습니다.
그러나 암호화 하지 않고 평문으로 통신을 하기 때문에 도청의 위험성이 있고,
통신 상대를 확인하지 않기 때문에 올바른 사용자인척 위장하여 통신을 할 수 있는 등...
완전성을 증명할 수 없기 때문에 원본 데이터에 대한 변조의 가능성이 있다는 문제점이 있습니다.

 

예를 들면, 어떤 유저가 사이트에서 로그인을 했을 때 HTTP 프로토콜 상에서는 아이디와 비밀번호가 문자열이 그대로 노출이 됩니다.

그러면 해커는 패킷분석을 통해 유저의 아이디와 비밀번호를 획득할 수가 있고, 이는 큰 문제를 야기합니다.

즉, 보안에 취약한 프로토콜이죠.

 

이러한 취약점을 보완한 것이 바로 HTTPS입니다.

HTTPS는 증명서를 통해 서버 또는 클라이언트의 신원을 확인하고, 데이터를 암호화, 인증, 안정성 보호를 할 수 있는 프로토콜입니다.


위의 예에서 HTTP 프로토콜이 아닌 HTTPS 프로토콜을 사용했을 경우,

로그인 과정에서 해커는 암호화된 데이터밖에 얻을 수 밖에 없으므로, HTTPS를 사용하는 사이트는 신뢰성 있는 사이트가 되는 것입니다.


HTTPS는 완전히 새로운 프로토콜이 아니라, HTTP 통신에 소켓 연결 부분을 SSL Layer로 대체하고 있을 뿐입니다.

HTTP는 직접 TCP와 통신하지만 SSL을 사용하는 경우 HTTP는 SSL과 통신하고 SSL이 TCP와 통신하게 됩니다.


SSL을 사용하면 서버, 클라이언트 모두 암호화된 데이터를 복호화 하는 과정이 필요하기 때문에 자원 소모가 발생하게 됩니다.

따라서 SSL을 사용하면 성능이 조금 느리다는 점이 있지만, 보안이 중요하기 때문에 세계적으로 HTTPS 사용을 권장하고 있습니다.





2. SSL( Secure Socket Layer )

SSL은 HTTPS와 유사한 개념으로 사용되는데, 엄밀히 말하면 HTTPS는 SSL위에서 동작합니다.

TCP/IP Model( 초록색 테두리 )에서는 TCP계층과 HTTP간의 통신을 위해 소켓을 이용합니다.

그리고 TCP계층과 Application계층 사이에는 어떠한 계층이 존재하지 않습니다.


그런데 HTTPS 프로토콜을 보시면 TCP계층과 Application계층 사이에 SSL계층이 추가되어 있습니다.

즉, HTTPS는 SSL위에서 동작하고 있는 것입니다.

SSL은 일종의 보안 계층으로 동작하는데, 그 이유는 소켓이 SSL과 연결되어 SSL이 보안 기능을 제공하기 때문입니다.



위와 조금 별개의 이야기지만, TLS라는 것이 있습니다.

SSL이 점차 보편화되면서 국제 표준화 기구(IETF)에서 이를 관리하기 시작했는데, 이 때 SSL 이름이 TLS로 변경되었습니다.

SSL과 TLS는 사실상 같다고 보셔도 무방하며, 실제로는 SSL이라는 이름으로 널리 사용되고 있습니다.





3. SSL 인증서의 목적

HTTPS를 사용하려면 신뢰할 수 있는 사이트라는 것을 인증할 수 있는 인증서가 있어야 합니다.

인증서의 목적은 2가지가 있습니다.

  • 클라이언트가 접속하려는 웹 사이트( 서버 )가 신뢰 할 수 있는 사이트인지 보장합니다.
    • 즉, 클라이언트가 접속하려는 사이트가 공인된 기관( CA )으로부터 SSL인증서를 발급 받았는지를 통해 신뢰할 수 있는 사이트인지를 보장받습니다.
  • SSL 통신에 사용할 공개키를 클라이언트(브라우저)에게 제공합니다.
    • 즉, 브라우저가 공개키를 획득하면 서버와 통신을 할 때 데이터를 암호화, 복호화를 할 수 있습니다.

즉, "CA로부터 신뢰할 수 있는 사이트라는 것을 인증받으면 공개키를 얻을 수 있고, 공개키를 통해 데이터를 암호화, 복호화 한다"로 정리할 수 있습니다.





4. SSL 인증서의 내용

인증서의 내용은 위의 목적을 달성하기 위한 정보들이 있습니다.

예를 들면,

  • 인증서를 발급한 기관
  • 서비스를 제공하는 도메인
  • 클라이언트가 접속하려는 서버의 공개키
  • 공개키의 암호화 방법
  • ...

즉, 인증서 내용안에는 SSL 프로토콜을 위한 정보들이 있습니다.


실제로 어떤 정보들이 있는지 구글의 메인 페이지에서 SSL인증서를 확인해보겠습니다.

"개발자 도구 실행 -> 상단의 security 탭 클릭 -> View certificate" 클릭 




일반 탭의 각 내용을 살펴보도록 하겠습니다.

발급 대상은 서비스를 제공하는 도메인을 의미합니다.

즉, 구글에서 SSL인증서 내용을 보고 있으니 구글의 도메인이 출력될 것입니다.


발급자는 인증서를 발급한 기관을 의미합니다.

유효기간은 이 인증서의 유효한 기간을 의미합니다.

다음으로 "자세히" 탭을 보시면,

어떤 공개키 방식을 사용하는지(RSA), 암호화는 어떤 알고리즘에 의해 진행되는지를 보여줍니다.





5. SSL인증서가 신뢰할 수 있는 사이트인지 보증하는 방법

클라이언트가 어떤 웹 서비스에 로그인을 한다고 가정하겠습니다.

그러면 서버는 클라이언트에게 인증서를 제공합니다.


크롬, 익스플로러 같은 브라우저는 공인 인증기관(CA)의 목록들을 알고 있기 때문에, 서버로부터 제공받은 인증서가 CA 목록에 포함되어 있는지 확인합니다.

또한 브라우저는 CA의 목록을 알고 있기 때문에, CA의 공개키를 알고 있습니다.


CA 목록에 포함되어 있다면 브라우저는 CA의 공개키를 이용해서 인증서를 복호화 합니다.

인증서는 CA의 비밀키로 암호화 된 것이기 때문에 공개키를 갖고 있는 브라우저는 인증서를 복호화 할 수 있습니다.

이를 복호화 할 수 있다는 것은 공개키와 비밀키가 쌍으로 잘 이루어져 있다는 의미이므로 신뢰할 수 있는 사이트가 되는 것입니다.


즉, 브라우저에 내장되어 있는 CA의 공개키를 통해 서버로부터 받은 인증서를 복호화 했다는 것은 CA가 그 서버를 "신뢰할 수 있는 사이트다"라고 보장한 것이 됩니다.

복호화하지 못했다는 것은 그 서버가 CA로부터 인증서를 발급받지 못한 경우가 되겠죠?


위의 내용을 아래 사진으로 정리해볼 수 있을 것 같습니다.




6. SSL인증서를 얻는 방법

그렇다면 SSL인증서는 어떻게 발급받을 수 있을까요?

공인된 인증기관에 서류를 제출하고 돈을 지불함으로써 얻을 수 있는데, 개인이 사용하기에는 부담이 되죠.


이러한 이유로 HTTPS의 보급을 위해 SSL 인증기관을 만들었는데, 그것이 Let's encrypt 입니다.

Let's Encrypt 사용 방법도 쉽고 간단하기 때문에 많이 사용하고 있습니다.

실제 서비스하는 기업에서도 사용하고 있으니 애용하는 것이 좋겠죠?

( Nginx에서 Let's Encrypt를 적용하는 방법은 여기를 참고해주세요. )





이상으로 SSL인증서의 목적은 무엇인지, 인증서에는 어떤 내용들이 담겨있는지, 어떻게 신뢰할 수 있는 사이트가 보장 되는지에 대해 알아보았습니다.


[ 참고 자료 ]

https://opentutorials.org/course/228/4894