Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14장] 보안 HTTP #11

Open
eunbc opened this issue Dec 6, 2023 · 7 comments
Open

[14장] 보안 HTTP #11

eunbc opened this issue Dec 6, 2023 · 7 comments
Labels

Comments

@eunbc
Copy link

eunbc commented Dec 6, 2023

No description provided.

@eunbc eunbc added 4주차 and removed 4주차 labels Dec 6, 2023
@annahxxl
Copy link

annahxxl commented Dec 8, 2023

HTTP를 안전하게 만들기

HTTPS

  • http를 안전하게 만드는 방식 중 가장 인기 있는 것
  • 모든 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화
  • http 하부의 전송 레벨 암호 보안 계층을 제공함으로써 동작
    • 보안 계층은 SSL(Secure Socket Layer)/TLS(Transport Layer Security)를 이용하여 구현된다

대칭키 암호법

  • 인코딩 할 때 사용하는 키가 디코딩을 할 때와 같다
  • 비밀 키가 누설되면 안 된다는 것이 매우 중요하다
  • 발송자와 수신자 둘 다 공유키를 가져야 한다
  • 개인마다 비밀 키를 생성해야 하므로, 각 개인들과 대화를 나누어야 한다면, N개의 노드가 있다면 총 N**2개의 키가 필요하다

공개키 암호법

  • 두 개의 비대칭 키를 사용한다
  • 하나는 호스트의 메시지를 인코딩하기 위한 것이며, 다른 하나는 그 호스트의 메시지를 디코딩하기 위한 것이다
  • 인코딩 키는 모두를 위해 공개되어 있다(그래서 공개키 암호 방식)
  • 디코딩 키는 호스트만이 알고 있다
  • 누구나 사용할 수 있는 인코딩 키가 할당되어 있기 때문에, 대칭 키의 쌍이 N**2로 폭발적으로 증가하는 것을 피할 수 있다

RSA

  • 공개 키, 가로채서 얻은 암호문의 일부, 메시지와 그것을 암호화한 암호문 들을 악당이 알고 있다 해도 비밀인 개인 키를 계산할 수 없다는 것을 확신시켜 주는 알고리즘

혼성 암호 체계와 세션 키

  • 비대칭 공개키 암호 방식은 누구나 공개키만 알면 그 키에 대응되는 공개 서버에 안전하게 메시지를 보낼 수 있게 해주므로 훌륭하다
  • 그러나 공개키 암호 방식의 알고리즘은 계산이 느린 경향이 있다
  • 그래서 실제로는 대칭과 비대칭 방식을 섞은 것이 쓰인다
  • 채널 수립 → 공개 키, 나머지 데이터 암호화 → 대칭 키

디지털 서명

  • 누가 메시지를 썼는지 알려주고 그 메시지가 위조되지 않았음을 증명하기 위해 이용

디지털 인증서

  • 신뢰할 수 있는 기관으로부터 보증 받은 사용자나 회사에 대한 정보를 담고있다

인증서의 내부

  • 인증 기관에 의해 디지털 서명된 정보의 집합이 담겨있다
    • 대상의 이름
    • 유효 기간
    • 인증서 발급자
    • 인증서 발급자의 디지털 서명
    • 대상의 공개키
    • •••

서버 인증을 위해 인증서 사용하기

  1. https를 통한 안전한 웹 트랜잭션을 시작할 때, 최신 브라우저는 자동으로 접속한 서버에서 디지털 인증서를 가져온다, 만약 서버가 인증서를 갖고 있지 않다면, 보안 커넥션은 실패한다
    • (참고) 서버 인증서가 포함하는 필드
      • 웹 사이트의 이름과 호스트 명
      • 웹 사이트의 공개키
      • 서명 기관의 이름
      • 서명 기관의 서명
      • •••
  2. 브라우저가 인증서를 받으면, 서명 기관을 검사한다
    • 만약 그 기관이 공공이 신뢰할만한 서명 기관이라면, 브라우저가 이미 설치된 채로 출하하여 브라우저는 그것의 공개키를 이미 알고 있을 것
    • 만약 서명 기관이 모르는 곳이라면, 확인하기 위한 대화상자를 보여준다

HTTPS의 세부사항

HTTPS 스킴

  • http 스킴: 80 포트
    • 평범한 http 명령 전송
  • https 스킴: 443 포트
    • 서버와 ssl 보안 매개변수를 교환하면서 핸드셰이크를 하고 암호화된 http 명령 전송
    • ssl 트래픽은 바이너리 프로토콜이기 때문에, http와 완전히 다르다

SSL 핸드셰이크

  • 핸드셰이크에서는 다음과 같은 일이 일어난다
    • 프로토콜 버전 번호 교환
    • 양쪽이 알고 있는 암호 선택
    • 양쪽의 신원을 인증
    • 채널을 암호화하기 위한 임시 세션 키 생성
  • ssl 핸드셰이크 핵심 과정
    1. 클라이언트가 암호 후보들을 보내고 인증서 요구
    2. 서버는 선택된 암호화 인증서 보냄
    3. 클라이언트가 비밀전보를 보내고, 클라이언트와 서버는 키를 만든다
    4. 클라이언트와 서버는 서로에게 암호화를 시작한다고 말해준다

서버 인증서

  • 클라이언트 인증서는 웹 브라우징에선 흔히 쓰이지 않는다
  • 보안 https 트랜잭션은 항상 서버 인증서를 요구한다

사이트 인증서 검사

  • 최신 웹브라우저들은 대부분 인증서에 대해 간단하게 기본적인 검사를 하고, 그 결과를 더 철저한 검사를 할 수 있는 방법과 함께 사용자에게 알려준다
  • 검사 수행 단계
    • 날짜 검사
      • 유효함 확인
    • 서명자 신뢰도 검사
      • 신뢰할 만한 인증 기관이 대상을 위한 인증서에 서명을 하고, 그 대상이 어떤 사이트 인증서에 서명을 한다면, 브라우저는 그 인증서를 올바른 인증 기관 경로에서 파생된 것으로 봄
    • 서명 검사
      • 서명 기관이 믿을 만하다고 판단하면, 브라우저는 서명기관의 공개키를 서명에 적용하여 그의 체크섬과 비교해봄으로써 인증성의 무결성을 검사
    • 사이트 신원 검사
      • 인정서의 도메인 이름이 대화 중인 서버의 도메인 이름과 비교하여 맞는지 검사

프락시를 통한 보안 트래픽 터널링

  • 클라이언트는 종종 웹 서버에 접근해주는 웹 프락시 서버를 이용한다
  • 그러나 클라이언트가 서버로 보낼 데이터를 서버의 공개키로 암호화하기 시작했다면, 프락시는 더 이상 http 헤더를 읽을 수 없다
  • http ssl 터널링 프로토콜을 사용해서, 클라이언트는 먼저 프락시에게 자신이 연결하고자 하는 안전한 호스트와 포트 정보를 암호화가 시작되기 전의 평문으로 말해줄 수 있다

@eunbc
Copy link
Author

eunbc commented Dec 8, 2023

HTTP를 안전하게 만들기

  • HTTPS : 넷스케이프에서 처음 만들었으며, HTTP를 안전하게 만드는 방식 중 가장 인기 있음
  • 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전에 암호화된다

디지털 암호학

  • 암호란 메시지를 인코딩하는 특정한 방법과, 나중에 그 비밀 메시지를 디코딩하는 방법이다
  • 디지털 계산이 발전함에 따라 복잡한 인코딩과 디코딩 알고리즘이 가능해졌고, 매우 큰 키를 지원하는 것이 가능해졌다.
  • 평문 → (인코드)키 → 암호문
  • 암호문 → (디코드)키 → 평문

대칭키 암호법

  • 인코딩 키 = 디코딩 키
  • DES, RC2, RC4
  • 무차별로 모든 키 값을 대입해보는 공격(열거 공격) - 128비트 키는 매우 강력하다
  • 단점 : 발송자와 수신자가 서로 대화하려면 둘 다 공유키를 가져야 함

공개키 암호법

  • 두 개의 비대칭 키를 사용한다. 하나는 인코딩 키로, 모두를 위해 공개되어 있다. 다른 하나는 디코딩 키(개인키)로, 호스트만이 알고 있다. 메시지의 인코딩은 누구나 할 수 있지만, 소유자를 제외한 누구도 그 메시지를 디코딩할 수 없다
  • 누구나 공개키만 알면 그 키에 대응되는 공개 서버에 안전하게 메시지를 보낼 수 있다.
  • 그러나 공개키 암호 방식의 알고리즘은 계산이 느린 경향이 있다
  • 노드들 사이의 안전한 의사소통 채널을 수립할 때는 편리하게 공개키 암호를 사용하고, 이렇게 만들어진 안전한 채널을 통해 임시의 무작위 대칭 키를 생성하고 교환하여 이후 나머지 데이터를 암호화할 때는 빠른 대칭 키를 사용하는 방식이 흔히 쓰인다
  • RSA
스크린샷 2023-12-08 오전 11 01 24

디지털 서명

  • 디지털 서명은 메시지에 붙어있는 특별한 암호 체크섬이다
    • 서명은 메시지를 작성한 저자가 누군지 알려준다
    • 메시지 위조를 방지한다

디지털 인증서

  • 인터넷의 신분증인 디지털 인증서는 신뢰할 수 있는 기관으로부터 보증 받은 사용자나 회사에 대한 정보를 담고 있다.
  • 대상의 이름, 유효 기간, 인증서 발급자, 인증서 발급자의 디지털 서명, 서명 알고리즘, 대상의 공개키
  • X.509 라 불리는 표준화된 서식에 저장
  • 브라우저가 서버 인증을 확인하는 과정
    • 브라우저는 자동으로 접속한 서버에서 디지털 인증서를 가져옴
    • 인증서의 서명 기관을 검사함
    • 서명 기관이 신뢰할만한 서명 기관이라면 브라우저는 그것의 공개키를 이미 알고 있을 것이다. 서명 검증
    • DigiCert, GeoTrust, Thawte, Comodo…

HTTPS의 세부사항

  • HTTPS는 HTTP 프로토콜에 대칭, 비대칭 인증서 기반 암호 기법의 강력한 집합을 결합한 것이다
  • 보안 전송 계층을 통해 전송되는 HTTP. HTTP 메시지를 TCP로 보내기 전에 먼저 그것들을 암호화하는 보안 계층(SSL, TLS) 으로 보낸다
    • 클라이언트는 웹 서버의 443 포트로 TCP 커넥션 수립
    • 클라이언트와 서버는 암호법 매개변수와 교환 키를 협상하면서 SSL 계층 초기화 (SSL 핸드셰이크)
    • SSL을 통해 보내진 HTTP 요청 / 요청 메시지는 암호화되어 TCP 로 전송
    • SSL을 통해 보내진 HTTP 응답 / TCP를 통해 보내진 암호화된 응답
    • SSL 닫힘 통지
    • TCP 커넥션 닫힘
  • 사이트 인증서 검사
    • Certificate Authority(CA) : 인증서 지원자의 신원 및 사업의 선량함을 입증하는 알기 쉬운 절차를 갖춘 잘 알려진 기관
    • 브라우저는 신뢰할 만한 서명 기관의 목록을 포함한 채로 배포됨

프락시를 통한 보안 트래픽 터널링

  • 클라이언트는 종종 그들을 대신하여 웹 서버에 접근해주는 웹 프락시 서버를 이용한다
  • 클라이언트가 서버로 보낼 데이터를 서버의 공개키로 암호화한다면, 프락시는 HTTP 헤더를 읽을 수 없다
    • HTTPS SSL 터널링 프로토콜
    • CONNECT 메서드로 희망하는 호스트와 포트 번호를 평문으로 전달, 완료되면 클라이언트와 서버 사이에서 데이터가 직접적으로 오갈 수 있게 해주는 터널을 만든다

@byulcode
Copy link

byulcode commented Dec 8, 2023

14. 암호화 기술

대칭키 암호법

  • 암호화와 복호화에 같은 암호키를 쓰는 알고리즘을 의미
  • 대칭 키 암호는 속도가 빠름
  • 발송자와 수신자는 대화하기 위해 서로 공유하는 키를 가져야 함
  • 대표적인 알고리즘으로 AES, DES, SEED 등이 있음

공개키(비대칭키) 암호법

  • 호스트 혼자 디코딩 키를 갖고 있으며 누구나 암호화하여 호스트에게 암호화된 메시지를 보낼 수 있음.
  • 일반적으로 공개 키 암호 방식은 대칭 키 암호화보다 느림
  • 대표적인 알고리즘으로 RSA가 있음

혼성 암호 체계 / 세션 키

  • 공개키 암호방식 알고리즘 계산은 느린 경향이 있음.
  • 실제로는 대칭과 비대칭을 섞어 사용함.
  • 연결을 수립할 때는 공개키로 편리하게 만들어진 안전한 채널을 통해, 데이터를 암호화할 때는 빠른 대칭키를 사용함.

디지털 서명 (공개키 사용)

  • 누가 메시지를 썼는지
  • 메시지가 위조되지 않았음을 증명하는데 사용
  • 서명은 암호 체크섬이다.

디지털 인증서

  • 온라인 신분증
  • 신뢰할 수 있는 기관으로부터 보증 받은 사용자 또는 회사에 대한 정보 증명
  • ‘인증 기관’에 의해 디지털 서명된 정보의 집합
    ex) 대상의 이름, 유효 기간, 인증서 발급자, 발급자의 디지털 서명 …., 대상의 공개키

서버 인증을 위해 인증서 사용하기

  • HTTPS 트랜잭션 수립
  • 브라우저가 서버에서 디지털 인증서를 가져옴(인증서가 없다면 보안 커넥션 실패!)
  • 서명 기관 검사
    • CA(서버를 보증하는 인증 기관)로부터 서명된 인증서라면 이미 브라우저가 공개키를 가지고 있다.
    • CA로부터 서명되지 않은 인증서의 경우 경고창을 띄운다.

HTTPS 세부사항

HTTPS

  • HTTP + 대칭 & 비대칭 인증서 암호화
  • HTTPS는 SSL 프로토콜 위에서 돌아가는 프로토콜이다.
  • HTTPS를 사용할 때 모든 요청과 응답 데이터는 네트워크로 보내지기 전 암호화 된다.

HTTPS 스킴

  • HTTPS를 사용한다는 것을 알리기 위해 HTTPS 스킴 사용

  • https → 443번 포트 (http → 80번 포트)

  • HTTP Handshake

    SSL Handshake 과정

    1. 클라이언트가 서버에 접속 (Client Hello)
      • 클라이언트 측에서 서버에 접속한다 (3-Way Handshake)
      • 클라이언트는 브라우저가 지원하는 암호화 방식을 전송(암호화 방식 협상을 위함)
      • 랜덤 데이터
    2. 서버가 클라이언트에 응답 (Server Hello)
      • 서버가 선택한 암호화 방식 클라이언트에 전달 (암호화 방식 협상 종료)
      • SSL 인증서 클라이언트에 전달
      • 랜덤 데이터
    3. 클라이언트가 premaster secret값 생성
      • 서버의 인증서가 CA에 의해서 발급된 것인지 확인 ⇒ CA의 공개키를 이용해 인증서 복호화
      • 서버로부터 받은 랜덤 데이터와 클라이언트에서 생성한 랜덤 데이터를 조합해서 premaster secret키를 생성
        • 세션 단계에서 데이터를 주고 받을 때 암호화를 하기 위해 사용
        • 대칭키이기 때문에 노출되면 안됨
      • premaster secret 값을 서버에 전달하는 방식이 공개키. 서버의 공개키로(인증서에 있었음) premaster secret값을 암호화한 후 서버에 전송하면 안전하게 전송 가능
    4. SSL HandShake 종료 & HTTPS 통신 시작
      • 서버는 클라이언트가 전송한 premaster secret값을 자신의 비공개키로 복호화
      • session key 생성 후 서버와 클라이언트는 데이터를 대칭키 방식으로 주고 받음

클라이언트 인증서

  • 일반적으로 클라이언트 인증서를 서버로 보내진 않는다. 웹 서버가 요청하면 보내야 하지만 거의 그럴 일이 없다.

서버 인증서

  • 서버에 개인 정보를 보내기 전 신뢰할 수 있는 서버인지 확인해야 한다.
  • HTTPS 트랜잭션은 항상 서버 인증서를 요구한다.

인증서 검사

  • 날짜 검사
    • 인증서가 유효함을 확인하기 위해 시작/종료일 검사
  • 서명자 신뢰도 검사
    • CA
  • 서명 검사
    • 브라우저는 서명기관의 공개키를 서명에 적용하여 인증서 무결성 검사
  • 사이트 신원 검사
    • 호스트의 도메인이 인증서에 적힌 도메인과 같은지 검사

프락시를 통한 보안 트래픽 터널링

클라이언트가 서버로 보낼 데이터를 서버의 공캐키로 암호화 ⇒ 프락시는 HTTP 헤더를 읽을 수 없음 ⇒ 요청을 어디에 보내야 하는지 알 수 없음 ⇒ SSL 터널링 프로토콜

HTTPS SSL 터널링 프로토콜

  • 클라이언트는 암호화 전 프락시에 자신이 연결하고자 하는 포트를 알려준다
    • CONNECT 메서드를 이용해 호스트:포트 정보를 평문으로 전송해준다.

@park0jae
Copy link
Member

park0jae commented Dec 8, 2023

웹의 보안

  • 사용자는 웹을 중요한 일을 처리할 때 사용
  • 대량 구매, 은행 업무, 보안 자료 접근 등
  • 웹에서 전송되는 모든 데이터는 패킷으로 전송되어 클라이언트-서버 사이에서 누군가 정보를 빼가려고 할 가능성 O

Q. 클라이언트-서버만 데이터를 확인할 수 있게 하려면 ?

A. 데이터를 전송할 때 암호화하고, 서버는 암호화를 해제하여 데이터를 확인 → (HTTPS)

HTTPS

  • HTTP를 안전하게 만드는 기술 중 가장 널리 사용되는 기술
  • 모든 HTTP 요청과 응답 데이터는 네트워크로 보내지기 전 암호화
  • HTTPS는 HTTP 하부에 전송 레벨 암호 보안 계층을 제공하여 동작 → SSL(Secure Sockets Layer)

→ OSI 7 계층을 기준으로 Presentation Layer에서 이를 담당한다. 쉽게 Transport Layer 윗단에서 담당한다고 생각

대칭키 암호법

  • 즉, 인코딩을 할 때 사용하는 키와 디코딩을 할 때 사용하는 키가 같음
  • (e = d)이 키를 그냥 k라고 하자.
  • 대칭키 암호에서 발신자와 수신자 모두 통신을 위해 키 k를 공유할 필요가 있다.
  • 발신자는 공유된 비밀 키를 메시지 인코딩 및 수신자에게 발송하기 위해 사용
  • 수신자는 공유된 비밀 키를 메시지 디코딩를 위해 사용
  • ex) DES, RC2 , RC4 등이 있음

[ 열거 공격 ]

  • 비밀 키는 누설되어선 X
  • 좋은 암호 알고리즘 → 공격자가 코드 크래킹을 위해 우주에 존재하는 모든 키 값을 시도하는 방법밖에 없음
  • 8비트 → 256가지
  • 40비트 → 약 1조
  • 현재의 128비트 DES 키 → 브루트포스한 방식으로는 깰 수 없다고 알려져 있음

[ 키 ]

  • 128비트로 암호화하여, 대칭키 방식으로 키를 공유했다고 가정
  • 키를 모르면 상대방은 무차별 대입으로는 암호를 해제할 수 없음
  • 대칭키 암호 방식은 세션 하나마다 하나의 키를 유지해야 함
    • A,B,C,D가 하나의 서버에 요청을 했을 때 → A 서버를 대상으로 키 .. B서버를 대상으로 키..
    • 서버 입장에서 벅찬 일

→ 이런 문제를 해결하기 위해 공개키(비대칭키) 암호법이 등장

공개키(비대칭키) 암호법

  • 한 쌍의 호스트가 인코딩/디코딩 키를 두 개의 비대칭 키를 사용
  • 하나는 호스트의 메시지를 인코딩 하기 위함 / 하나는 호스트의 메시지를 디코딩하기 위함
  • 이 때, 인코딩 키는 모두를 위해 공개(= 공개키 암호법이라고 불리는 이유)하며 디코딩 키는 호스트만이 알고 있음
  • 공개키는 보통 디지털 인증서 안에 있고 모든 호스트가 공개된 키를 통해 인코딩하기 때문에 대칭키처럼 쌍이 N^2 만큼 증가하는 것을 피할 수 있음
  • 모든 사람이 서버에 보내는 메시지를 같은 키로 인코딩 할 수 있으나, 누구도 그 메시지를 디코딩 할 수 없음 (서버만이 디코딩 개인 키를 소유)
  • ex) 가장 유명한 공개키 알고리즘 RSA

[ RSA ]

  • 공개키 암호 시스템 중 하나
  • 암호화 뿐만 아니라 전자서명이 가능한 최초의 알고리즘
  • 전자상거래에서 가장 흔히 쓰이는 공개키 알고리즘
image
  • 먼저 abc라는 키로 암호화를 진행한 메시지를 A → B로 전달한다고 해보자. (대칭키 상황)
  • 이 때 해커가 데이터를 탈취하여 메시지를 임의로 조작해 B에게 전달할 가능성이 있다.
  • 따라서 문제점들이 존재하는데, 첫 번째로 키 전달문제와 두 번째로 인증 문제가 존재한다.

[ 공개키 암호화 ]

image
  • 공개키는 누구에게나 공개되어 있기 때문에 A → B에게 전송할 때 B의 공개키로 암호화를 진행하여 전달
  • 복호화는 B의 개인키로만 가능
  • 해커가 탈취하더라도, B의 개인키를 모르기 때문에 정보를 파악할 수 없다. ( = 대칭키에서의 키 전달 문제 해결)
  • 그러나 파일을 탈취해 B의 공개키로 이상한 파일을 암호화해서 보낼 위험성이 존재한다. ( = 인증 문제 여전히 해결 X)

[ 개인키 암호화 ]

image
  • A의 개인키로 암호화하여 B에게 전송 = A의 공개키로 복호화 가능
  • 이 때, 해커가 탈취하게 되면 A의 공개키로 정보를 파악할 수 있음
  • 누구나 정보를 열람할 수 있기 때문에 보안 위험성이 존재하지만, A가 보냈다라는 것이 100% 증명되는 셈
    • A의 개인키는 A만 가지고 있기 때문에 A만이 암호화가 가능
    • 즉, 인증 문제 해결
  • 이것이 전자서명의 기본

→ 공개키 암호화와 , 개인키 암호화 둘 다 여전히 하나씩은 문제가 존재하는데… ?


[ 두 번 암호화 ]

image
  • A의 개인키로 암호화 하기에 , A의 공개키로 열리지 않으면 A가 보낸 것이 아님
  • A의 공개키로 인증을 해도, B의 비밀키로 정보를 열어야 확인 가능
    • B의 비밀키는 B만 가지고 있기 때문에 해커는 이를 알 수 없음
  • 즉, A가 보내는 정보는 안전하게 B에게 전송 가능하게 되고 아무나 정보를 알 수 없게 된다. ( = RSA)

< 참고 강의 >
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0/dashboard

디지털 서명

암호 체계는 메시지 암호화/복호화 뿐만 아니라, 누가 메시지를 썼는지 알려주고 그 메시지가 위조되지 않음을 증명하기 위해 메시지에 서명을 하는데 이용할 수 있다.

[ 서명은 암호 체크섬이다. ]

  • 메시지를 작성한 저자가 누군지 알려준다.
    • 저자는 저자의 개인키를 소유
    • 오직 저자만이 이 체크섬을 계산할 수 있음 → 체크섬은 저자의 개인 ‘서명’처럼 동작
  • 메시지 위조를 방지한다.
    • 악의적인 공격자가 송신중인 메시지를 수정 ?
    • 체크섬은 저자의 비밀 개인 키와 관련되어 있기 때문에 침입자는 위조된 메시지에 대한 올바른 체크섬을 날조할 수 없음 → 체크섬은 더 이상 위조된 메시지와 맞지 않음
  • 보통 비대칭 공개키에 의해 생성
  • 디지털 서명 절차 (노드 A가 B에게 메시지를 보내고 서명하는 프로세스)
    1. A는 가변 길이 메시지를 정제하여 고정된 길이의 요약으로 만듬
    2. A는 그 요약에, 사용자의 개인 키를 매개변수로 하는 서명 함수를 적용
    3. 한 번 서명이 계산되면, A는 이를 메시지 끝에 덧붙이고 메시지와 서명을 B에게 전송
    4. 메시지를 받은 B는 공개키를 이용해 A가 보낸 서명을 역함수를 적용하여 풀어냄
      1. 풀어낸 요약이 B가 갖고 있는 버전의 요약과 일치하지 않으면 ? 송신 중 위조되었거나 발신자가 개인 키를 갖고 있지 않은 것 (=A가 아니다.)

디지털 인증서

디지털 인증서는 신뢰할 수 있는 기관으로부터 보증 받은 사용자나 회사에 대한 정보를 담고 있다.

[ 인증서 내부 ]

  • 디지털 인증서에는 또한 공식적으로 ‘인증 기관’에 의해 디지털 서명된 정보의 집합이 담겨 있다.
  • 대상의 이름 (사람, 서버, 조직 등)
  • 유효 기간
  • 인증서 발급자 (인증서를 보증하는 사람)
  • 인증서 발급자의 디지털 서명

[ 인증서 사용 ]

  • 사용자가 HTTPS를 통해 안전한 웹 트랜잭션을 시작할 때 최신 브라우저는 자동으로 접속한 서버에서 디지털 인증서를 가져옴
  • 만약 서버가 인증서를 가지고 있지 않으면, 보안 커넥션은 실패함
  • 서버 인증서는 다음을 포함한 많은 필드를 가지고 있음
    • 웹 사이트의 이름 & 호스트명
    • 웹 사이트 공개키
    • 서명 기관의 이름
    • 서명 기관의 서명

→ 브라우저가 인증서를 받으면 서명 기관을 검사하여 신뢰할만한 서명 기관이라면 ? 브라우저는 그것의 공개키를 미리 알고 있을 것이며 서명을 검증할 수 있고 만약 서명 기관이 모르는 곳이라면, 브라우저는 그 서명 기관을 신뢰할 것인지에 대한 판단을 사용자에게 넘긴다.

HTTPS 세부사항

https://www.google.com // 보안이 없는 HTTP URL 스킴 접두사 : http
https://www.google.com // 보안이 되는 HTTPS URL의 스킴 접두사 : https

클라이언트는 웹 리소스에 대한 트랜잭션 수행을 요청받으면 URL의 스킴을 검사한다.

  • http 스킴 → 클라이언트는 서버에 80(기본값) 포트로 연결하고 평범한 HTTP 명령 전송
  • https 스킴 → 클라이언트는 서버에 443(기본값) 포트로 연결하고 서버와 바이너리 포맷으로 된 몇몇 SSL 보안 매개변수를 교환하면서 ‘핸드셰이크’를 하고 암호화된 HTTP 명령이 뒤를 잇는다.

[ SSL 핸드셰이크 ]

암호화된 HTTP 메시지를 보내기 전, 클라이언트와 서버는 SSL 핸드셰이크를 할 필요가 있다.
암호화된 HTTP 데이터가 네트워크를 오가기도 전에, SSL은 통신을 시작하기 위해 상당한 양의 핸드셰이크 데이터를 주고 받는다.

[ SSL 핸드셰이크 과정 간략화 ]

  1. 클라이언트가 암호 후보들을 보내고 SSL 인증서를 요구
  2. 서버는 선택된 암호와 인증서를 보냄
  3. 클라이언트가 비밀정보를 보내고 클라이언트와 서버는 키를 만듬
  4. 클라이언트와 서버는 서로에게 암호화를 시작한다고 말함

[ 서버 인증서 ]

  • 보안 HTTPS 트랜잭션은 항상 서버 인증서를 요구함
  • 서버에 개인정보를 보내기 전, 그 서버를 얼마나 신뢰할 수 있는지 평가하는 것을 도와줌

[ 사이트 인증서 검사 ]

  • 날짜검사 브라우저는 인증서가 유효함을 확인하기 위해 인증서의 시작 및 종료일 검사
  • 모든 인증서는 서버를 보증하는 어떤 기관(Certificate Authority, CA)에 의해 서명되어 있음
  • 서명 기관이 믿을 만하다고 판단하면, 브라우저는 서명 기관의 공개 키를 서명에 적용해 그의 체크섬과 비교하여 인증서의 무결성을 검사함
  • 대부분의 브라우저는 인증서의 도메인 이름이 대화중인 서버의 도메인 이름과 비교하여 맞는지 검사

프락시를 통한 보안 트래픽 터널링

  • 클라이언트가 서버로 보낼 데이터를 서버의 공개키로 암호화하기 시작하면 프락시는 더 이상 HTTP 헤더를 읽을 수 없음
  • 프락시가 HTTP 헤더를 읽을 수 없다면, 프락시는 요청을 어디로 보내야 하는지 알 수 없게 되어버림
  • 위 문제를 해결하기 위해 HTTPS SSL 터널링 프로토콜을 사용하면 된다.
  1. HTTP는 CONNECT라 불리는 새로운 확장 메서드를 이용해 평문으로 된 종단 정보를 전송

  2. CONNECT 메서드는 프락시에게 희망하는 호스트와 포트번호로 연결해달라고 요청한다.

  3. 완료되면 클라이언트와 서버 사이에서 데이터가 직접적으로 오갈 수 있게 해주는 터널을 만든다.

// 구조
CONNECT 호스트:포트 HTTP버전CRLF

<SSL로 암호화된 데이터>

// 예시
CONNECT home.netscape.com:443 HTTP/1.0
User-agent: Mozilla/1.1N

<SSL로 암호화된 데이터>

요청의 빈 줄 다음, 클라이언트는 프락시로부터 응답을 기다리고 프락시는 요청을 판단 후, 목적지 서버로 연결하고 성공하면 200 Connection Established 응답을 클라이언트에게 보냄

HTTP/1.0 200 Connection established
Proxy-agent: Netscape-Proxy/1.1

@cloudwi
Copy link
Contributor

cloudwi commented Dec 8, 2023

https://cloudwi.notion.site/14-058a0ee109c94b2298f80920173b6f2a?pvs=4

HTTPS와 SSL

HTTPS와 SSL를 같은 의미로 이해하고 있는 경우가 많다. 이것은 맞기도 틀리기도 하다. 그것은 마치 인터넷과 웹을 같은 의미로 이해하는 것과 같다. 결론적으로 말하면 웹이 인터넷 위에서 돌아가는 서비스 중의 하나인 것처럼 HTTPS도 SSL 프로토콜 위에서 돌아가는 프로토콜이다.

SSL 디지털 인증서

SSL 인증서는 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서다. 클라이언트가 서버에 접속한 직후에 서버는 클라이언트에게 이 인증서 정보를 전달한다. 클라이언트는 이 인증서 정보가 신뢰할 수 있는 것인지를 검증 한 후에 다음 절차를 수행하게 된다. SSL과 SSL 디지털 인증서를 이용했을 때의 이점은 아래와 같다.

  • 통신 내용이 공격자에게 노출되는 것을 막을 수 있다.
  • 클라이언트가 접속하려는 서버가 신뢰 할 수 있는 서버인지를 판단할 수 있다.
  • 통신 내용의 악의적인 변경을 방지할 수 있다.

SSL에서 사용하는 암호화의 종류

대칭키

이 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모르면 암호를 푸는 행위인 복호화를 할 수 없다. 대칭키는 동일한 키로 암호화와 복호화를 같이 할 수 있는 방식의 암호화 기법을 의미한다. 즉 암호화를 할 때 1234라는 값을 사용했다면 복호화를 할 때 1234라는 값을 입력해야 한다는 것이다.

공개키

대칭키 방식은 단점이 있다. 암호를 주고 받는 사람들 사이에 대칭키를 전달하는 것이 어렵다는 점이다. 대칭키가 유출되면 키를 획득한 공격자는 암호의 내용을 복호화 할 수 있기 때문에 암호가 무용지물이 되기 때문이다. 이런 배경에서 나온 암호화 방식이 공개키방식이다.

공개키 방식은 두개의 키를 갖게 되는데 A키로 암호화를 하면 B키로 복호화 할 수 있고, B키로 암호화하면 A키로 복호화 할 수 있는 방식이다. 이 방식에 착안해서 두개의 키 중 하나를 비공개키(private key, 개인키, 비밀키라고도 부른다)로하고, 나머지를 공개키(public key)로 지정한다. 비공개키는 자신만이 가지고 있고, 공개키를 타인에게 제공한다. 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화한다. 암호화한 정보를 비공개키를 가지고 있는 사람에게 전송한다. 비공개키의 소유자는 이 키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다고해도 비공개키를 모르면 정보를 복호화 할 수 없기 때문에 안전하다. 공개키로는 암호화는 할 수 있지만 복호화는 할 수 없기 때문이다.

전자서명

이 방식은 이렇게 응용할 수도 있다. 비공개키의 소유자는 비공개키를 이용해서 정보를 암호화 한 후에 공개키와 함께 암호화된 정보를 전송한다. 정보와 공개키를 획득한 사람은 공개키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다면 의도하지 않은 공격자에 의해서 데이터가 복호화 될 위험이 있다. 이런 위험에도 불구하고 비공개키를 이용해서 암호화를 하는 이유는 무엇일까? 그것은 이것이 데이터를 보호하는 것이 목적이 아니기 때문이다. 암호화된 데이터를 공개키를 가지고 복호화 할 수 있다는 것은 그 데이터가 공개키와 쌍을 이루는 비공개키에 의해서 암호화 되었다는 것을 의미한다. 즉 공개키가 데이터를 제공한 사람의 신원을 보장해주게 되는 것이다. 이러한 것을 전자 서명이라고 부른다.

비트코인[[편집](http://wiki.hash.kr/index.php?title=%EA%B3%B5%EA%B0%9C%ED%82%A4&action=edit&section=8)]

모든 비트코인 주소에는 공개키(public key)와 [개인키](http://wiki.hash.kr/index.php/%EA%B0%9C%EC%9D%B8%ED%82%A4)(private key)가 들어 있다. 공개키는 공개되어 있는 키로, 비트코인을 전송받을 때 사용되며, 개인키는 개인이 소유하고 있어야 하는 키로, 비트코인을 출금할 때 사용한다.

  1. 거래를 하려면 한 쌍의 개인키와 공개키가 필요하다. 먼저, 송금자는 한 쌍의 키를 생성한다. 개인키는 [전자 서명](http://wiki.hash.kr/index.php/%EC%A0%84%EC%9E%90_%EC%84%9C%EB%AA%85) 생성 용도이고, 공개키는 전자 서명을 이용한 데이터 검증 용도이다.
  2. 송금자는 공개키를 미리 수신자에게 전달한다. 송금자의 전자 서명을 검증하기 위해 수신자는 자신이 받은 공개키로 전자 서명을 검증할 수 있다.
  3. 송금자는 데이터의 해시값을 생성하고, 생성된 해시값을 개인키를 이용해 암호화한다. 이 때 만들어진 암호문을 전자 서명 혹은 [디지털 서명](http://wiki.hash.kr/index.php/%EB%94%94%EC%A7%80%ED%84%B8_%EC%84%9C%EB%AA%85)이라고 한다. 보낸 사람만 알고 있는 개인키로 암호문을 만들었기 때문에 그 암호문은 전자 서명으로서의 의미를 가진다.
  4. 송금자는 생성된 전자 서명을 원래 보내려는 원본 데이터에 붙여서 수신자에게 전달한다.
  5. 수신자는 원본 데이터의 해시값을 스스로 계산해 본다. 또, 공개키를 사용해 받은 전자 서명을 복호화하면 데이터가 생성된다.
  6. 수신자는 원본 데이터의 해시값과 복호화한 결과를 비교한다. 만약 결과가 일치한다면 데이터는 변조되지 않은 것이다.

SSL 인증서

SSL 인증서의 역할은 다소 복잡하기 때문에 인증서의 메커니즘을 이해하기 위한 몇가지 지식들을 알고 있어야 한다. 인증서의 기능은 크게 두가지다. 이 두가지를 이해하는 것이 인증서를 이해하는 핵심이다.

  1. 클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장한다.
  2. SSL 통신에 사용할 공개키를 클라이언트에게 제공한다.

CA

인증서의 역할은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지를 보장하는 역할을 한다. 이 역할을 하는 민간기업들이 있는데 이런 기업들을 CA(Certificate authority) 혹은 Root Certificate 라고 부른다. CA는 아무 기업이나 할 수 있는 것이 아니고 신뢰성이 엄격하게 공인된 기업들만이 참여할 수 있다. 그 중에 대표적인 기업들은 아래와 같다. 수치는 현시점의 시장점유율이다. ([위키피디아 참조](https://en.wikipedia.org/wiki/Certificate_authority))

  • Symantec (VeriSign, Thawte, Geotrust) with 42.9% market share
  • Comodo with 26%
  • GoDaddy with 14%
  • GlobalSign with 7.7%

사설 인증기관

개발이나 사적인 목적을 위해서 SSL의 암호화 기능을 이용하려한다면 자신이 직접 CA의 역할을 할 수도 있다. 물론 이것은 공인된 인증서가 아니기 때문에 이러한 사설 CA의 인증서를 이용하는 경우 브라우저는 아래와 같은 경고를 출력한다.

!https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/228/1536.gif

공인된 CA가 제공하는 인증서를 사용한다면 브라우저의 주소창이 아래와 비슷한 모양을 보여줄 것이다.

!https://s3.ap-northeast-2.amazonaws.com/opentutorials-user-file/module/228/1537.gif

SSL 인증서의 내용

SSL 인증서에는 다음과 같은 정보가 포함되어 있다.

  1. 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
  2. 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)

인증서의 내용은 위와 같이 크게 2가지로 구분할 수 있다. 1번은 클라이언트가 접속한 서버가 클라이언트가 의도한 서버가 맞는지에 대한 내용을 담고 있고, 2번은 서버와 통신을 할 때 사용할 공개키와 그 공개키의 암호화 방법들의 정보를 담고 있다. 서비스의 도메인, 공개키와 같은 정보는 서비스가 CA로부터 인증서를 구입할 때 제출해야 한다.

위와 같은 내용은 CA에 의해서 암호화 된다. 이 때 사용하는 암호화 기법이 [공개키](https://opentutorials.org/course/228/4894#public) 방식이다. CA는 자신의 CA 비공개키를 이용해서 서버가 제출한 인증서를 암호화하는 것이다. CA의 비공개키는 절대로 유출되어서는 안된다. 이것이 노출되는 바람에 [디지노타](http://www.ted.com/talks/mikko_hypponen_three_types_of_online_attack.html)라는 회사는 파산된 사례도 있다.

[SSL 인증서 해킹으로 구글 등 피해자 속출](https://www.itworld.co.kr/news/71499)

CA를 브라우저는 알고 있다

인증서를 이해하는데 꼭 알고 있어야 하는 것이 CA의 리스트다. 브라우저는 내부적으로 CA의 리스트를 미리 파악하고 있다. 이 말은 브라우저의 소스코드 안에 CA의 리스트가 들어있다는 것이다. 브라우저가 미리 파악하고 있는 CA의 리스트에 포함되어야만 공인된 CA가 될 수 있는 것이다. CA의 리스트와 함께 각 [CA의 공개키](https://opentutorials.org/course/228/4894#public)를 브라우저는 이미 알고 있다.

클라이언트가 접속한 서버가 신뢰 할 수 있는 서버임을 보장

웹 브라우저가 서버에 접속할 때 서버는 제일 먼저 인증서를 제공한다. 브라우저는 이 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지를 확인한다. 확인 결과 서버를 통해서 다운받은 인증서가 내장된 CA 리스트에 포함되어 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다. CA의 공개키를 이용해서 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다.

해당 CA의 비공개 키를 가지고 있는 CA는 해당 CA 밖에는 없기 때문에 서버가 제공한 인증서가 CA에 의해서 발급된 것이라는 것을 의미한다. CA에 의해서 발급된 인증서라는 것은 접속한 사이트가 CA에 의해서 검토되었다는 것을 의미하게 된다. CA의 검토를 통과했다는 것은 해당 서비스가 신뢰 할 수 있다는 것을 의미한다. 이것이 CA와 브라우저가 특정 서버를 인증하는 과정이다.

SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 혼합해서 사용한다. 즉 클라이언트와 서버가 주고 받는 실제 정보는 대칭키 방식으로 암호화하고, 대칭키 방식으로 암호화된 실제 정보를 복호화할 때사용할 대칭키는 공개키 방식으로 암호화해서 클라이언트와 서버가 주고 받는다.

  • 실제 데이터 : 대칭키
  • 대칭키의 키 : 공개키

컴퓨터와 컴퓨터가 네트워크를 이용해서 통신을 할 때는 내부적으로 3가지 단계가 있다. 아래와 같다.

악수 -> 전송 -> 세션종료

이것은 은밀하게 일어나기 때문에 사용자에게 노출되지 않는다. 이 과정에서 SSL가 어떻게 데이터를 암호화해서 전달하는지 살펴보자.

SSL 방식을 이용해서 통신을 하는 브라우저와 서버 역시 핸드쉐이크를 하는데, 이 때 SSL 인증서를 주고 받는다. 이 과정은 앞에서 설명한 바 있다. 인증서에 포함된 서버 측 공개키의 역할은 무엇일까를 이제 알아보자.

공개키는 이상적인 통신 방법이다. 암호화와 복호화를 할 때 사용하는 키가 서로 다르기 때문에 메시지를 전송하는 쪽이 공개키로 데이터를 암호화하고, 수신 받는 쪽이 비공개키로 데이터를 복호화하면 되기 때문이다. 그런데 SSL에서는 이 방식을 사용하지 않는다. 왜냐하면 공개키 방식의 암호화는 매우 많은 컴퓨터 자원을 사용하기 때문이다. 반면에 암호화와 복호화에 사용되는 키가 동일한 대칭키 방식은 적은 컴퓨터 자원으로 암호화를 수행할 수 있기 때문에 효율적이지만 수신측과 송신측이 동일한 키를 공유해야 하기 때문에 보안의 문제가 발생한다. 그래서 SSL은 공개키와 대칭키의 장점을 혼합한 방법을 사용한다. 그 핸드쉐이크 단계에서 클라이언트와 서버가 통신하는 과정을 순서대로 살펴보자.

  1. 클라이언트가 서버에 접속한다. 이 단계를 Client Hello라고 한다. 이 단계에서 주고 받는 정보는 아래와 같다.

    • 클라이언트 측에서 생성한 랜덤 데이터 : 아래 3번 과정 참조
    • 클라이언트가 지원하는 암호화 방식들 : 클라이언트와 서버가 지원하는 암호화 방식이 서로 다를 수 있기 때문에 상호간에 어떤 암호화 방식을 사용할 것인지에 대한 협상을 해야 한다. 이 협상을 위해서 클라이언트 측에서는 자신이 사용할 수 있는 암호화 방식을 전송한다.
    • 세션 아이디 : 이미 SSL 핸드쉐이킹을 했다면 비용과 시간을 절약하기 위해서 [기존의 세션](https://opentutorials.org/course/228/4894#session)을 재활용하게 되는데 이 때 사용할 연결에 대한 식별자를 서버 측으로 전송한다.
  2. 서버는 Client Hello에 대한 응답으로 Server Hello를 하게 된다. 이 단계에서 주고 받는 정보는 아래와 같다.

    • 서버 측에서 생성한 랜덤 데이터 : 아래 3번 과정 참조
    • 서버가 선택한 클라이언트의 암호화 방식 : 클라이언트가 전달한 암호화 방식 중에서 서버 쪽에서도 사용할 수 있는 암호화 방식을 선택해서 클라이언트로 전달한다. 이로써 암호화 방식에 대한 협상이 종료되고 서버와 클라이언트는 이 암호화 방식을 이용해서 정보를 교환하게 된다.
    • 인증서
  3. 클라이언트는 서버의 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA 리스트를 확인한다. CA 리스트에 인증서가 없다면 사용자에게 경고 메시지를 출력한다. 인증서가 CA에 의해서 발급된 것인지를 확인하기 위해서 클라이언트에 내장된 CA의 공개키를 이용해서 인증서를 복호화한다. 복호화에 성공했다면 인증서는 CA의 개인키로 암호화된 문서임이 암시적으로 보증된 것이다. 인증서를 전송한 서버를 믿을 수 있게 된 것이다.클라이언트는 상기 2번을 통해서 받은 서버의 랜덤 데이터와 클라이언트가 생성한 랜덤 데이터를 조합해서 pre master secret라는 키를 생성한다. 이 키는 뒤에서 살펴볼 세션 단계에서 데이터를 주고 받을 때 암호화하기 위해서 사용될 것이다. 그럼 문제는 이 pre master secret 값을 어떻게 서버에게 전달할 것인가이다. 이 때 사용하는 방법이 바로 공개키 방식이다.  그럼 서버의 공개키는 어떻게 구할 수 있을까? 서버로부터 받은 인증서 안에 들어있다. 이 서버의 공개키를 이용해서 pre master secret 값을 암호화한 후에 서버로 전송하면 안전하게 전송할 수 있다.

    이 때 사용할 암호화 기법은 대칭키이기 때문에 pre master secret 값은 제 3자에게 절대로 노출되어서는 안된다.

    서버의 공개키로 pre master secret 값을 암호화해서 서버로 전송하면 서버는 자신의 비공개키로 안전하게 복호화 할 수 있다.

@kimday0326
Copy link
Member

HTTPS

온라인 쇼핑이나, 인터넷 뱅킹 등의 트랜잭션에서는 강력한 보안을 필요로 한다. 따라서 HTTP의 하부에 전송 레벨 암호 보안 계층을 제공하는 HTTPS가 등장하였다. 이 계층은 SSL 또는 TLS라고 불리며, 이 둘은 매우 비슷하기 때문에 일반적으로는 SSL이라고 통틀어 칭하기도 한다.

과거의 암호화

  • 율리우스 카이사르는 메세지의 각 글자를 알파벳 순서상 세 번 뒤의 글자로 교체하는 rotate-by-3 암호를 사용했다.
  • 기술이 진보하며 키와 암호화 기계(인코더)를 이용하여 암호화를 하기 시작하였다. 대표적인 것이 'N번-회전' 암호이다.
  • 현대에는 복잡한 인코딩과 디코딩 알고리즘을 사용할 수 있게 되었으며, 더욱 크래킹하기 어려운 암호 알고리즘을 사용할 수 있게 되었다.

대칭키 암호법

인코딩 할때와 디코딩 할 때 같은 키를 사용하는 암호화 방식
대표적으로 DES, Triple-DES, RC2, RC4 등이 있다.

  1. 무차별 대입법(열거 공격)
    • 가능한 모든 키값을 대입하여 크래킹을 시도하는 방식
    • 128비트 DES키는 실질적으로 깨뜨릴 수 없다고 알려져 있다.
  2. 공유키 관리
    • 발송자와 수신자가 서로 대화하기 위해서는 둘 다 공유키를 가져야 한다.
    • 연결되는 노드 별로 각각의 공유키가 필요하므로, 대략 N^2 개의 공유키가 필요하다.

공개키 암호법

두 개의 비대칭 키를 사용하는 암호화 방식. 대표적인 알고리즘으로 RSA
하나는 인코딩(공개키)을 위해, 하나는 디코딩(개인키)을 위해 사용한다.

  1. 연결 수립 이후, 수신자측이 자신의 공개키를 송신자에게 전송한다.
  2. 송신자 측은 전달받은 공개키를 이용해 데이터를 암호화, 전송한다.
  3. 수신자는 받은 데이터를 개인키로 복호화한다.

실제로는 두 대칭과 비대칭 방식을 섞어서, 의사소통 채널을 수립할 때는 공개 키 암호를 사용하고, 만들어진 채널을 통해 대칭 키를 생성하고 교환하여 이후의 나머지 데이터를 암호화한다.

디지털 인증서

일종의 여권과도 같으며, 다음의 기본적인 내용들을 담고있다.

  • 대상의 이름(사람, 서버, 조직 등)
  • 유효기간
  • 인증서 발급자
  • 인증서 발급자의 디지털 서명

세계적인 단일 표즌은 없지만 일반적으로 X.509라 불리는 표준화된 서식을 사용한다.

HTTP 세부사항

보안 전송 셋업

  • URL의 스킴을 이용해 http(:80)를 사용할건지 https(:443)를 사용할 건지 결정한다.
  • 443 포트로 TCP 연결이 완료되면, 클라이언트와 서버는 SSL 핸드셰이크를 진행한다.
    1. 클라이언트가 암호 후보들을 보내고 인증서를 요구한다.
    2. 서버는 선택된 암호와 인증서를 보낸다.
    3. 클라이언트가 비밀정보를 보내고, 키를 만든다.
    4. 서로에게 엄호화를 시작한다고 말해준다.

서버 인증서

이 과정에서 사용되는 서버 인증서에는 다음과 같은 내용이 담긴다.

  • 조직의 이름
  • 주소
  • 서버 DNS 도메인 이름
  • 사이트의 DNS 호스트 명
  • ...

사이트 인증서 검사

SSL 자체는 웹서버 인증서를 검증할 것을 요구하지 않지만, 웹브라우저들 대부분은 인증서에 대해 간단한 검사를 진행한다.

  1. 날짜검사
  2. 서명자 신뢰도 검사
  3. 서명 검사
  4. 사이트 신원 검사

가상 호스팅과 인증서

가상 호스트로 운영되는 사이트의 경우, 보안 트랜잭션을 시작하는 모든 사용자를 알맞은 호스트에게 리다이렉트한다.

프락시를 통한 보안 트래픽 터널링

  • 암호화를 진행 한 경우, 프락시 서버가 헤더를 제대로 읽을 수 없다.
  • 이런 문제를 해결하기 위해 HTTPS SSL 터널링 프로토콜을 사용한다.
  • 클라이언트는 CONNECT 확장 메서드를 이용해 평문으로 된 종보를 전송하여, 자신이 가고자하는 호스트와 포트번호를 프락시에게 전달한다.

@KarmaPol
Copy link
Member

KarmaPol commented Dec 8, 2023

HTTP 보안 기술은 다음을 제공해야한다

  • 서버 인증
  • 클라이언트 인증
  • 무결성
  • 암호화
  • 효율
  • 편재성
  • 관리상 확장성
  • 적응성
  • 사회적 생존성

HTTPS

HTTP 하부에 전송 레벨 암호 보안 계층 제공
SSL 또는 TLS

디지털 암호학

대칭키 암호

발송자와 수신자 모두 통신을 위해 비밀 키 k를 똑같이 공유
DES, Triple-DES, RC2

키 길이와 열거 공격

40비트 대칭키 암호는 무차별 대입으로 몇 초만에 해독

공유키 발급하기

N명이 서로 공유키를 발급하면 대략 N^2개의 공유키가 필요
이를 일일히 관리하기 어려움

공개키 암호

X에게 보내는 메시지는 X의 공개키로 암호화
X는 받은 메시지를 비밀키로 디코딩 -> 다른 사람은 디코딩할 수 없다

공개키 암호는 계산이 느린경향이 있어,
채널 수립은 공개키로, 채널 수립 이후엔 대칭키를 섞어서 사용

디지털 암호

메시지에 붙어있는 특별한 암호 체크섬
-> 저자의 개인키로만 체크섬을 계산할 수 있으므로 위조 방지

디지털 인증서

CERTS 기관으로부터 보증받은 사용자, 회사에 대한 정보를 담음

인증서 내부

  • 대상 이름
  • 유효 기간
  • 인증서 발급자
  • 인증서 발급자의 디지털 서명

HTTPS

URL이 HTTPS 스킴을 갖고 있다면

  • 클라이언트는 서버에 443번 포트로 연결
  • SSL 보안 매개변수를 교환하며 핸드셰이크

보안 전송 셋업

  1. 서버 443 포트로 TCP 커넥션 수립
  2. SSL 매개변수 핸드셰이크
  3. 클라이언트 : SSL을 통해 보낸 HTTP 요청 -> TCP를 통해 보내진 암호화된 요청
  4. 서버 : SSL을 통해 보낸 HTTP 응답 -> TCP를 통해 보내진 암호화된 응답
  5. SSL 닫힘 통지
  6. TCP 커넥션 닫힘

SSL 핸드셰이크

  • 프로토콜 버전 번호 교환
  • 양쪽이 알고 있는 암호 선택
  • 양쪽 신원 인증
  • 채널 암호화하기 위한 임시 세션 키 생성

진짜 HTTPS 클라이언트

SSL 트래픽을 직접 보내는 것은 매우 복잡 -> 라이브러리를 사용해라

  • OpenSSL

프락시를 통한 보안 트래픽 터널링

프락시는 암호화된 요청의 HTTP 헤더를 읽을 수 없다

  • HTTPS SSL 터널링 프로토콜
    CONNECT 확장 HTTP 메소드를 통해 커넥션 수립
    -> 핸드셰이크 성공 시 데이터가 직접적으로 오가는 터널 수립, SSL 데이터 전송 시작

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants