HTTP/SSL


용어

  • HTTP
    • Hypertet Transfer Protocol
    • HTML을 전송하기 위한 통신규약
  • HTTPS
    • HTTP + Over Secure Socket Layer
    • 전송되는 데이터를 암호화하여 주고받는다
    • 웹사이트가 SSL/TLS 인증서로 보호되는 경우 URL에 HTTPS를 표시
  • SSL
    • 보안소켓계층 (Secure Sockets Layer)
    • 웹사이트와 브라우저 사이에 전송되는 데이터를 암호화하여 보호하기 위한 표준 기술
  • TLS
    • 전송계층보안 (Transport Layer Security)
    • SSL의 후속버전
    • TLS 1.0은 SSL의 3.0을 계승한다
  • 대칭키
    • 암호화와 복호화에 사용되는 키가 동일한 암호화 방식
    • A키로 암호화한 정보는 A키로 복호화
    • 비대칭키에 비해 속도가 빠르다
    • 키를 전달하는 과정에서 탈취당할 위험성이 있다
  • 비대칭키
    • 암호화와 복호화에 사용되는 키가 서로 다른 암호화 방식
    • A키로 암호화한 정보는 B키로 복호화
    • B키로 암호화한 정보는 A키로 복호화
    • 대칭키에 비해 1000배 정도 속도가 느리다
      • 복잡한 수학 연산을 수행하기 때문
    • 두개의 키 중 하나는 공개키, 하나는 비공개키
    • 정보를 암호화한 후 정보와 함께 공개키를 전달
      • 공개키가 유출되었을 경우
        • 공격자는 공개키로 암호화한 정보를 복호화할 수 없다
        • 공격자는 비공개키로 암호화한 정보를 복호화할 수 있다
      • 데이터의 보호목적 X
        • 공개키로 암호화된 정보를 복호화할 수 있다는 것은 해당 정보가 비공개키로 암호화된 것이고, 데이터를 제공한 사람의 신원을 보장해주는 것
        • 전자서명

SSL 인증서

  • SSL인증서의 역할
    • 접속한 서버가 신뢰할 수 있는 서버임을 보장
    • 클라이언트에게 통신에 사용할 공개키 전달
  • CA
    • SSL인증서 발급 기업
    • 브라우저의 소스코드 안에 CA의 리스트 내장
      • 각 CA의 공개키를 브라우저는 이미 파악
    • CA의 비공개키로 서버의 인증서를 암호화한 후 전달
    • 아무 회사나 CA가 될 수 없고 엄격하게 공인된 기업만 참여 가능
    • CA의 비공개키는 절대 유출되어서는 안된다
  • 보증방법
    • 클라이언트가 서버에 접속할 때 서버는 인증서 제공
    • 해당 인증서가 클라이언트 브라우저에 내장된 CA리스트에 있다면 공개키를 이용해 인증서 복호화
    • 인증서를 복호화할 수 있다는 것은 해당 정보가 CA의 비대칭키로 암호화되었다는 것
    • CA의 비대칭키로 암호화되었다는 것은 CA에 의해 발급된 인증서라는 것
    • CA에 의해 발급된 인증서라는 것은 해당 사이트가 CA에 의해 검토되었다는 것
    • CA에 의해 검토되었다는 것은 해당 사이트를 신뢰할 수 있다는 것

SSL 동작 과정

  • 대칭키 방식과 비대칭키(공개키)방식을 혼합하여 사용
  • 주고받을 정보를 비대칭키방식으로 암호화하면 비용이 많이 든다
    • 많은 양의 데이터를 복잡한 연산으로 암호화하면 서버에 부담
    • 주고받을 정보는 대칭키로 암호화
    • 대칭키를 그냥 전달하면 보안에 문제
    • 대칭키는 비대칭키로 암호화하여 전달
  • 악수(Handshake) - 세션 - 세션종료
  • 악수
    • 실제 데이터를 주고 받기 전 서로 상대방이 존재하는지, 데이터를 주고받을 때 어떤 방법을 사용해야하는지 파악
    • Client Hello
      • 클라이언트가 서버에 접속한 단계
      • 클라이언트가 서버에게 전달하는 정보
        • 클라이언트가 생성한 랜덤데이터
        • 클라이언트가 지원하는 암호화방식
        • 세션아이디
          • 이미 악수를 마쳤을 경우 비용과 시간을 절약하기 위해 기존의 세션 재활용, 이를 위한 식별자
    • Server Hello
      • Client Hello에 대한 응답
      • 서버가 클라이언트에 전달하는 정보
        • 서버가 생성한 랜덤데이터
        • 서버가 선택한 암호화방식
        • 인증서
    • 클라이언트가 서버의 인증서 확인
      • 브라우저에 내장된 CA리스트를 확인하여 서버의 인증서 확인
        • 리스트에 없을 시 사용자에게 경고
      • 브라우저에 내장된 CA의 공개키를 이용해 인증서 복호화
        • 복호화에 성공했다면, 해당 인증서가 CA의 개인키로 암호화되었다는 것을 보증
    • 클라이언트는 자신이 생성핸 랜덤데이터와 서버가 생성한 랜덤데이터를 조합
      • pre master secret key 생성
      • 서버의 인증서에 들어있는 공개키로 암호화 후 서버에 전송
      • 이는 서버의 비공개키로만 복호화 가능
    • 서버는 pre master secret key를 비공개키로 복호화
    • 현재 서버와 클라이언트 모두 pre master key 보유
    • 이를 master key로 변환
    • master key로 session key 생성
    • 악수 단계 종료
  • 세션
    • 실제로 서버와 클라이언트가 데이터를 주고받는 단계
    • 정보를 session key를 이용해 대칭키 방식으로 암호화
  • 세션종료
    • 데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알린다
    • 이후 대칭키인 세션키를 폐기