HTTPS

newhyork·2022년 4월 24일
0

HTTPS


HTTP over SSL / HTTP Secure

  • HTTP를 기반으로 통신을 하는데 그 전에,
    암호화된 데이터로 통신할 수 있도록 협의 과정(handshake)을 거쳐, 통신 간에 보안을 강화한다.
    • 협의 과정에서 쓰이는 프로토콜이 주로 SSL이다.
    • 결과적으로, 기존 HTTP의 평문 데이터가 아니라
      협의 결과(비밀키)를 통해 암호화된 데이터를 주고 받아 통신한다.
  • HTTP에 비해, 사용한다는 것 자체 만으로도 resource가 필요하므로 처리가 느리다.
    • HTTP로 주고받는 데이터는 평문인데 반해,
      HTTPS로 주고받는 데이터는 암호화되어있기 때문에 암호화 및 복호화하는 과정에 대해
      서버 및 클라이언트에서 resource가 필요하기 때문이다.
    • SSL handshake 과정에 대해서도 network resource가 필요하다.
      • SSL handshake는 클라이언트가 서버의 SSL인증서를 받고
        비밀키를 교환하기까지의 과정을 말한다.
        (cipher suite을 통해 데이터를 암호화할 알고리즘도 협의 사항에 포함한다)
  • 개인 정보 등의 민감한 정보를 다루는 등, 필요한 곳에서만 사용하는 게 보편적이다.
  • HTTPS도 HTTP에서의 TCP 계층의 3-way-handshake를 쓴다.
    물론, SSL handshake 전이다.
    • TCP 3-way-handshake는 클라이언트와 서버 간의 연결을 확립하기 위한 것이다.
  • HTTPS는 공개키 암호화 방식과 비밀키 암호화 방식을 둘 다 사용한다.
    • 비밀키를 안전하게 교환하기 위해서 공개키 암호화 방식을 사용하고,
      비밀키를 안전하게 교환했으면 이젠 비밀키를 통해 데이터를 암호화하여 사용한다.
    • 실제 데이터를 주고 받기에 공개키 암호화 방식만으로는 너무 느리기 때문이다.

HTTPS flow


  1. 서버 측에서는 자신이 진짜임을 증명하기 위해 인증기관으로부터 SSL 인증서를 발급받아야한다.
    그러기 위해 한 쌍의 공개키와 개인키를 생성하고,
    사이트 정보와 자신의 공개키를 인증기관에게 전달해서 SSL 인증서 생성을 요구한다.
  2. 인증기관은 해당 서버에 대한 검증을 거친 후,
    한 쌍의 공개키와 개인키를 생성하여 (아마 최초 한 번)
    자신의 '개인키'로 해당 사이트 정보와 ‘서버의’ 공개키를 '암호화'하여 (이를 '서명'이라고 한다.)
    서버에 SSL인증서를 전달한다.
    (이 때, 인증 기관의 공개키는 보통 웹 브라우저에 내장되어 있다.)
    그렇게 서버는 발급 받은 SSL인증서를 게시해 놓는다.
  3. 클라이언트가 최초에 서버로부터 SSL인증서를 획득한다.
    그리고 그 SSL인증서를 통해 서버가 진짜인지(인증기관의 서명이 있는지)
    인증기관의 '공개키'를 통해 해당 SSL인증서를 '복호화'를 시도해봄으로써 검증하려고 한다.
  4. 복호화를 통해 클라이언트는 해당 서버가 진짜인지와 서버의 공개키를 얻게 되고
    실제 데이터 암호화에 사용할 '비밀키'를 암호화하여 서버에게 전송한다.
  5. 서버는 클라이언트가 보낸 데이터(비밀키)를 자신의 개인키로 복호화한다.
    그래서 해당 클라이언트와 서버는 동일한 비밀키를 갖게 되어
    이후, 실제 데이터를 비밀키로 암호화하여 안전한 통신이 가능해진다.

공개키(비대칭키) 암호화 방식


  • 주로 암호화할 때 쓰는 키인 공개키는 각자 공개하며,
    주로 복호화할 때 쓰는 키인 개인키는 각자 비밀로 한다.
    이렇게 한 쌍의 키는, 각자에게 유일하다.
    (수신자 및 발신자는 서로 역할에 따라 서버가 되기도, 클라이언트가 되기도 한다.)
  • 발신자는 수신자의 공개키로 암호화하여 데이터를 보내고,
    수신자는 자신의 개인키를 통한 복호화로 올바른 데이터를 취할 수 있다.
    즉, 발신자가 수신자의 공개키로 암호하여 보낸 데이터는
    수신자의 공개키가 아닌 개인키를 통해서만 올바른 데이터로 취할 수 있다.
  • 그래서 비밀키(대칭키) 암호화 방식과 달리 별도의 키 교환이 불필요하며,
    암호화된 데이터를 수신할 수 있도록 공개키를 공개하기만하고, 개인키는 비밀로 한다.
  • HTTPS로 클라이언트와 서버 간의 비밀키 교환에 사용한다.

비밀키(대칭키) 암호화 방식


  • 암호화 및 복호화에 동일한 하나의 키를 사용하는 것이다.
  • HTTPS로 클라이언트와 서버 간의 실제 데이터 교환 시에 사용한다.

0개의 댓글