[CS] HTTPS

말하는 감자·2025년 1월 9일

CS

목록 보기
6/33
post-thumbnail

HTTP와 HTTPS

HTTP의 보안 문제

  1. 도청 가능
    • 평문 통신이므로 도청이 가능하다
  2. 메시지가 중간에 변경되어도 알 수 없다.
    • 완전성을 증명할 수 없기때문에 변조가 가능하며, 수신자는 이 사실을 알 수 없다
  3. 올바른 상대와 통신하고 있는지 알 수 없다.
    • 구조가 단순한 HTTP는 현재 통신하고 있는 상대가 누구인지 확인하지 않으므로 상대방이 위장한건지 파악이 불가능하다.

HTTPS

HTTPS: HTTP + Secure


TCP,IP와 직접적으로 연결되어있던 HTTP 에다가

중간에 SSL/TLS 프로토콜을 끼워 넣어 중간에 보안 요소를 추가한게 HTTPS

SSL(Secure Socket Layer) / TLS(Transport Layer Security)

  • SSL/TLS: 전송 레벨 암호 보안 계층으로, SSL/TLS 라는 프로토콜을 조합하여 안전한 통신로를 확립한다.
    • SSL은 넷스케이프에서 발명되어 사용되다가 IETF의 관리로 바뀌며 TLS라는 이름으로 변경되었다.

대칭키(공통키 암호화 방식)

  • 특징

    1. 송신자와 수신자는 같은 키를 공유한다
    2. 송신자와 수신자는 같은 키로 암호화하고 복호화한다.
    3. 공통키를 가지기 위해서는 키를 공유하는 과정이 필요
  • 문제점

    1. 키를 공유하는 과정에서, 탈취 당할 가능성
    2. 키를 손에 넣을 누구라도 암호를 해독할 수 있다

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

  • 특징
    1. 한 쌍의 키(비밀키+공개키)로 암호화와 복호화를 한다.
    2. 공개키로 평문을 암호화
    3. 비밀키(개인키)로 평문을 복호화
    4. 공개키로 암호화 된 것은 비밀키로만 복호화가 가능함
    5. 비밀키는 보낼 필요가 없음 (비밀키는 노출되면 절대x)
    6. 즉 공개키로 암호화된 암호문을 해독할 수 있는 사용자는, 개인키를 가지고 있는 소유자 뿐

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

  • 특징
    1. 비밀키로 암호화 된 암호문은 공개키를 가진 누구나 복호화 가능하다.
  • 왜 씀?
    • 개인키는 유일하기 때문에 개인키로 암호화되면 식별이 가능하다
    • 누가 메시지를 작성했는지 알려주는 역할
    • 즉, 그 메시지가 위조되지 않았음을 증명할 수 있다.

대칭키 vs 비대칭키

  • 대칭키
    • 암호화와 복호화를 같은 키로
    • 키를 공유하는 과정 필요 -> 노출되면 보안 망가짐
    • 암호화/복호화 속도 빠름
  • 비대칭키
    • 암호화와 복호화를 다른 키로
    • 키를 공유하는 과정이 불필요
    • 암호화 복호화 속도 느림

대칭키 + 비대칭키

HTTPS에서는 대칭키와 비대칭키를 혼합해서 사용하는데, 공통키를 공개키로 암호화해서 안전하게 교환한다.
즉, 키를 통신하는 과정에서 키가 노출되어도 어차피 암호화되었으니까 상관x

공개키 암호화의 문제점

공개키는 말 그대로 공개키로, 먼저 서버에서 제공을 받아야하는데 여기서 문제가 발생
공개키가 진짜인지 아닌지를 증명할 수 없다.
중간에 위조되었어도 알 방법이 x
-> CA의 필요성

CA(Certificate Authority)

"믿을 만한 제 3자가 보장"

  • 절차
    1. 서버는 인증 기관에 서버의 공개키와 사이트 정보를 전송한다.
    2. 인증 기관은 사이트를 검증한 후 인증 기관의 개인키로 서명한다. -> SSL 인증서
      • 서버의 공개키 사이트 정보를 인증기관의 비밀키로 암호화
    3. 인증 기관은 사이트 인증서(SSL 인증서)를 서버에게 전송한다
    4. 클라이언트가 공개키를 요청할 때, 서버는 공개키 대신 SSL 인증서를 제공
      • 공개키를 얻기 위해 SSL 인증서를 인증기관의 공개키를 통하여 복호화
    5. 인증 기관의 공개키를 통하여 복호화가 가능하다면, 위조되지 않은 사이트임을 확인 가능(= 신뢰할 수 있는 사이트)

HTTPS의 통신 흐름

  1. 클라이언트가 서버에 암호화에 필요한 정보들을 보내고, 인증서를 요구한다.
  2. 서버는 선택된 암호 정보와 인증서를 전송한다.
  3. 클라이언트는 서버가 신뢰할 수 있는 사이트임을 확인했다면(with CA), 공통키로 사용할 Pre-Master-Secret키를 생성한다.
  4. SSL 인증서를 통하여 얻은 공개키로 pre-Master-secret키(공통키)를 암호화 하여 전송한다.
  5. 서버는 개인키로 복호화하여 공통키를 획득한다
  6. 클라이언트와 서버간에 안전하게 공통키가 확보 되고(SSL에 의해서 접속이 확립), 통신은 보호된다.
  7. 대칭키 암호화 방식으로 메세지를 암호화하여 HTTP로 송수신한다.
profile
주니어개발자(?)

0개의 댓글