HTTPS란?

bkboy·2022년 8월 1일
0

웹 개발

목록 보기
9/26
post-thumbnail

HTTPS

기존 HTTP는 데이터를 주고 받을 때 암호화가 되지 않아 보안에 취약했다. 이를 보안하기 위해 만들어진것이 HTTPS이다.

HTTPS는 Hypertext Transfer Protocol Over Secure Socket Layer의 약자로 HTTP에 SSL이 추가가 된 것이다.
모든 HTTP 요청과 응답 데이터는 네트워크로 보내기지 전에 암호화가 된다.

암호화

암호화는 어떤 정보를 아무나 읽지 못하도록 키를 가지고 특정 알고리즘을 돌려 정보를 숨기는 것을 말한다. 키를 가지고 다시 알고리즘을 역행하면 복호화가 된다. 키는 여러가지 종류가 있는데 어떤 키를 사용할 것인가에 따라 암호화하고 복호화하는 방식이 달라진다.

  • 공개키 : 공개키는 모두가 볼 수 있는 키이다.
  • 비밀키 : 소유자만이 가지고 있는 키로 암호화/복호화에 사용된다.
  • 대칭키 암호화 : 서버와 클라이언트가 암호화/복호화에 동일한 비밀키를 사용하는 방식이다.
  • 비대칭키 암호화 : 서버와 클라이언트가 암호화/복호화에 각각 다른 비밀키를 사용하는 방식이다. 공개키를 통해 암호화 하고 비밀키를 통해 복호화한다.
  • 인증기관 (CA) : 클라이언트가 접속을 요청한 서버가 의도한 서버가 맞는지 인증해주는 역할을 하는 보증된 기업들을 말한다. 클라이언트는 서버에 요청을 해서 CA가 발급한 인증서를 받은 뒤 CA의 공개키로 복호화하여 신뢰할 만한 인증서인지 검증한다. CA의 공개키로 복호화되는 자료는 오직 CA의 비밀키로 암호화한 경우밖에 없기 때문에 복호화되면 신뢰할 만한 것이다.

SSL

SSL은 Secure Soket Layer, 보안 소켓 계층으로 웹 서버와 클라이언트의 통신 암호화 프로토콜이다. 인터넷 인증서라고도 불린다.

아래는 HTTP와 HTTPS의 차이를 보여주는 이미지이다.

SSL이 적용되지 않은 통신의 경우 평문이 그대로 전송이 된다. 제 3자가 악의를 가지고 통신 패킷을 탈취할 경우 그 내용을 쉽게 확인할 수 있다. SSL의 경우 암호화된 내용이 전달이되고 탈취되더라도 복호화 키가 없으면 원래 내용을 알 수 없다.

TLS(Transport Layer Security)

TLS는 전송 계층 보안으로 국제 인터넷 표준화 기구에서 개발한 것으로 SSL의 보안 취약점을 보완한 통신 보안 프로토콜이다. SSL을 보완한 것이 TLS지만, 인터넷에 적용되는 통신 보안 프로토콜은 전부 통틀어 SSL이라 부른다.

아래는 구글 창에 SSL을 검색하면 나오는 것을 캡쳐한 것인데
전송 계층 보안이 먼저나온다. 실제로 사용하고 있는것은 TLS지만 SSL이라고 부르는 것!

SSL의 원리

아래의 그림은 SSL의 통신 과정을 나타내고, 이러한 일련의 과정을 HandShake라고 한다. 좌측이 서버 우측이 클라이언트를 나타낸다.

  1. ClientHello 요청
    클라이언트가 특정 주소에 접근하면, 해당하는 서버에 요청을 보낸다. 요청에는 난수 데이터(클라이언트에서 생성한), 암호화 프로토콜 정보, 사용 가능한 암호화 기법, 세션 아이디, 기타 확정 정보 등이 포함된다.

  2. ServerHello 응답
    서버가 ClientHello 요청을 받으면 데이터를 담아 클라이언트에 보낸다. 데이터에는 난수 데이터(서버에서 생성한), 사용할 암호화 기법, 인증서(CA, 도메인, 공개키) 등의 정보가 담겨져 있다.
    인증서 정보와 함께, 서버와의 암호화 통신을 위한 서버 공개키가 전달된다. 서버의 공개키로 데이터를 암호화하면 서버는 이를 받아 비밀키로 복호화하여 요청을 분석할 수 있다.

  3. 인증서 검토
    서버가 전달한 인증서가, 실제 해당 서버의 인증서인지, 신뢰할 수 있는 CA에서 발급된 것인지, 실제 해당 CA에서 발급받았는지 등을 검토한다. 클라이언트에 내장된 CA 리스트를 살펴보고 포함되어 있다면 해당 CA 공개키를 이용해 인증서를 복호화한다. 위에도 언급되었듯 성공적으로 복호화가 된다면 신뢰할 수 있다.

    인증서에 이상이 없다면 주소창에 자물쇠 아이콘을 클릭하여 다음과 같은 정보를 볼 수 있다.

  1. Premaster Secret 송수신
    ClientHello, ServerHello에서 송수신한 난수 데이터를 조합하여 Premaster Secret 키를 생성한다. 이를 서버에서 받은 공개키로 암호화한다. 이 데이터는 서버가 가진 비밀키로만 복호화가 가능하기 때문에 탈취되더라도 내용이 보호된다. 이때 서버와 클라이언트 모두에서 Premaster Secret 키를 가지게 된다.

  2. 통신 키 생성
    서버와 클라이언트 양쪽에서 보유한 Premaster Secret 키를 토대로 Master Secret -> Session key를 생성한다. 이 과정부터 암호화 통신이 가능해진다.

  3. 데이터 송수신
    필요한 데이터는 저장된 Session key를 통한 대칭키 암호화 방식으로 암호화/복호화하여 통신한다.

  4. 세션 종료
    클라이언트와 연결이 끊겼을 경우 사용했던 Session key는 폐기한다.

참고

profile
음악하는 개발자

0개의 댓글