한윤석 개발 블로그

배운 것을 적는 블로그입니다.

HTTPS는 어떻게 동작하는가?

등록일: 2019-10-31
수정일: 2019-10-31

암호화 방식

대칭키

암호화할 때 사용되는 키와 암호를 풀 때 사용되는 키가 같다. 통신을 할 때 서로 대칭키를 알고 있어야 한다. 그러면 상대방에게 키를 줘야 하는데 이 키 자체는 암호화가 되어있지 않아서 키가 노출될 수 있다.

공개키

키가 2개가 있다. 암호화를 할 때 사용되는 키와 복호화를 할 때 사용되는 키가 서로 다르다. 하나는 공개키 하나는 비공개키라고 부른다. 주로 공개키를 공개하고 비공개키는 공개하지 않는다. 공개키에 해당하는 비공개키를 가지고 있는 사람에게 안전하게 데이터를 전송하려면 정보를 공개키로 암호화여 전송한다. 데이터를 비공개키로 풀어서 데이터를 볼 수 있다.

반대로 비공개키를 암호화여 데이터를 전송하면 공개키를 가지고 있는 사람은 암호화를 풀어서 데이터를 읽을 수 있다. 이 말은 해당 데이터가 공개키와 쌍을 이루는 비공개키로 암호화했다는 것을 알 수 있기 때문에 데이터를 전송한 주체가 비공개키를 가지고 있다는 것이 증명된 것이다.

SSL 인증서

클라이언트가 접속한 서버가 신뢰할 수 있는 서버임을 보장한다. 제3자(Certificate authority) 공인된 기관이 보증해준다. 인증서에는 인증서를 발부한 CA, 서비스의 도메인 정보, 서버의 공개키, 공개키의 암호화 방법이 들어가 있다. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다. 인증기관에 대해서는 웹브라우저가 알고 있다.

통신방법

공개키로 암호화해서 통신하는 것이 사실 더 안전하다. 하지만 암호화하고 복호화를 하는데 컴퓨팅 파워를 많이 쓴다. 대칭키를 주고받을 때는 비대칭키 암호화를 통해 교환을 하고 키를 교환한 이후로는 서로 대칭키를 알고 있기 때문에 대칭키 암호화를 이용해서 데이터를 주고받는다.

1. Handshake

  • 클라이언트에서 랜덤 한 데이터를 만들고, 세션 아이디, 클라이언트가 지원하는 암호화 방식들을 서버에 보낸다.
  • 서버도 랜덤 한 데이터를 만들고 서버가 사용할 암호화 방식과 인증서를 같이 클라이언트에 보낸다.
  • 서버의 인증서가 CA에서 발급된 것인지 확인하기 위해 클라이언트(브라우저)에 내장된 CA 리스트를 확인한다. CA 리스트에 인증서가 없다면 사용자에게 경고 메시지를 보여준다. 인증서가 CA에 의해서 발급된 것인지 확인하기 위해 클라이언트에 내장된 CA 공개키를 이용해서 인증서를 복호화 한다. 복호화에 성공한다는 것은 CA의 개인키로 암호화된 문서임이 보증된 것이기 때문에 인증서를 전송한 서버를 믿을 수 있다.
  • 서로 교환한 랜덤 데이터를 조합해서 비밀키를 생성한다. 비밀키를 서버에 전달할 때 공개키 방식 암호화를 이용해서 서버로 전송한다. 공개키는 인증서 안에 있다. 공개키로 암호화한 데이터는 대칭이 되는 비공개키로만 복호화가 가능하다. 서버는 자신이 가진 비공개키로 복호화 한다. 이러면 서로 비밀키가 공유되었다.

2. 세션

서로 비밀키를 교환했으므로 비밀키를 이용해서 암호화하여 실제 데이터를 주고받는다.

3. 세션 종료

데이터 전송이 끝나면 통신에서 사용한 대칭키인 세션키를 폐기하고 연결을 종료한다.

Sources


자바스크립트로 직접 만들면서 배우는 - 자료구조와 알고리즘 강의 바로 가기
실습으로 마스터하는 OAuth 2.0: 기본부터 보안 위험까지 - OAuth 2.0 강의 바로 가기
기계인간 이종립, 소프트웨어 개발의 지혜 - Git 강의 바로 가기

코드숨에서 매주 스터디를 진행하고 있습니다. 메일을 등록하시면 새로운 스터디가 시작될 때 알려드릴게요!