[HTTPS] 보안 HTTP
이 포스트는 “HTTP 완벽가이드”의 “14장, 보안 HTTP”을 정리한 내용입니다.
- 강력한 보안: 온라인 쇼핑, 인터넷 뱅킹
- 제한된 접근: 회사들의 중요 문서
- HTTP + 디지털 암호화 기술
보안 HTTP에 필요한 요구 사항
- 서버 인증
- 클라이언트 인증
- 무결성: 데이터 위조 확인
- 암호화: 도청으로부터 안전
- 효율: 저사양에서도 충분히 빠를 수 있는 알고리즘
- 편재성(Ubiquity): 프로토콜은 모든 클라이언트와 서버에서 지원되어야 함
- 관리상 확장성: 누구든 어디서든 즉각적인 보안 통신이 가능해야함
- 적응성: 최선의 보안 방법을 지원해야함
- 사회적 생존성: 사회의 문화적, 정치적 요구를 만족시켜야 함
HTTPS 개론
- 보안 HTTP중 가장 인기있는 방식
- Netscape Corp.에서 제안
http://
가 아닌https://
형식을 사용- HTTPS를 사용할 때, 모든 HTTP 요청과 응답은 네트워크로 보내지기 전에 암호화
- HTTP(어플리케이션 계층)와 TCP(전송 계층) 사이에 보안 계층을 제공, 이곳에서 인코딩, 디코딩 실행
– Secure Sockets Layer: SSL
– Transport Layer Security: TLS
그림1. HTTP, HTTPS의 계층 구조
- 보안 HTTP를 사용하기 위해 클라이언트, 웹 서버를 크게 변경할 필요 없음
- 대부분의 경우 TCP 입력/출력 호출을 SSL 호출로 대체 후
- 보안 정보를 설정하고 관리하기 위한 몇 가지 호출을 추가하면 됨.
디지털 암호학
- 암호: 텍스트를 아무나 읽지 못하도록 인코딩하는 알고리즘
- 키: 암호의 동작을 변경하는 숫자로 된 매개변수
- 대칭키 암호 체계: 인코딩과 디코딩에 다른 키를 사용하는 알고리즘
- 공개키 암호법: 비밀 메시지를 전달하는 수백만 대의 컴퓨터를 쉽게 만들 수 있는 시스템
- 디지털 서명: 메시지가 위조 혹은 변조되지 않았음을 입증하는 체크섬
- 디지털 인증서: 신뢰할 만한 조직에 의해 서명되고 검증된 신원 확인 정보
키가 있는 암호
- 키: 암호의 동작방식을 변경할 수 있는 암호 매개변수
- 키값에 따라 인코딩, 디코딩 결과가 제각각 다르게 동작
- 현대의 암호화 알고리즘은 알고리즘을 알아도 암호를 깨드리는 데에 도움이 될 패턴을 찾아내기 어렵게 설계
대칭키 암호법
- 인코딩과 디코딩에 같은 키를 사용하는 암호 알고리즘
- DES, Triple-DES, RC2, RC4
키 길이와 열거 공격(Enumeration Attack)
- 대부분의 경우, 인코딩 및 디코딩 알고리즘은 공개적
- 비밀 키는 누설되면 안됨
- 악의적인 목적으로 암호의 키 값을 알아내기 위해 무차별적으로 값을 입력할 수 있음
- 키의 길이에 따라 암호를 깨뜨리는데 드는 비용이 다름
– 40비트 키: 작고 중요하지 않은 업무
– 128비트 키: 매우 강력한것으로 간주, 무차별 대입으로는 실질적으로 깨뜨릴수 없다고 알려짐
공개키 암호법
- 대칭키는 호스트와 클라이언트 사이에 각각의 키가 필요
- 키를 발급, 관리하는데 어려움이 있음
- 인코딩 키는 공개, 디코딩 키는 호스트만 소유
- 누구든지 호스트로 요청이 가능, 호스트만 디코딩이 가능
- 공개키 암호화 기술을 통해 보안 프로토코콜을 모든 사용자에게 적용하는 것이 가능
- 공개 키 인프라 표준화 작업이 계속해서 진행중(X.509)
RSA
- 공개키 비대칭 암호의 과제는 공개키, 암호문과 메시지를 알고 있더라도 디코딩 키를 계산할 수 없어야 함
- MIT에서 발명되고 이어서 RSA 데이터 시큐리티에서 상용화된 RSA 알고리즘이 있다
혼성 암호 체계와 세션 키
- 공개키 암호 방식의 알고리즘은 계산이 느린 경향
- 의사소통 채널 수립할 때는 공개 키 암호를 사용
- 안전한 채널을 통해 무작위 대칭 키를 생성하고 교환하여 나머지 데이터를 암호화할 때 빠른 대칭키를 사용하는 방식이 사용
디지털 서명
- 암호 체계는 메시지 암호화 및 해독뿐만 아니라 서명에 이용될 수 있음
- 서명: 누가 메시지를 작성했는지, 메시지가 위조되지 않았음을 증명하는데 이용
서명: 암호 체크섬
- 서명은 메시지 작성자를 알려줌
- 작성자는 개인 키를 가지고 있기 때문에 작성자만이 체크섬을 계산 가능
- 체크섬은 저자의 개인 ‘서명’처럼 동작
- 서명은 메시지 위조 방지
- 도중에 메시지가 수정되면 체크섬이 맞지 않게됨
디지털 인증서
- 디지털 인증서는 ‘certs’라 불리는 신뢰할 수 있는 기관으로부터 보증 받은 사용자나 회사에 대한 정보를 담고 있음
그림2. 일반적인 디지털 서명의 포맷
X.509 v3 인증서
- 디지털 인증서에 대한 전 세계적인 단일 표준은 없음
- 대부분의 인증서가 X.509라 불리는 표준화된 서식에 저장
X.509 인증 필드
필드 | 설명 |
버전 | 이 인증서가 따르는 X.509 인증서 버전의 번호 |
일련번호 | 인증기관에 의해 생성된 고유 번호. CA로부터의 각 인증서는 반드시 고유 일련번호를 가져야함 |
서며 알고리즘 ID | 서명을 위해 사용된 알고리즘 |
인증서 발급자 | 인증서를 발급하고 서명한 기관의 이름. X.500 포맷으로 기록 |
유효 기간 | 인증서가 유효한 기간, 시작일과 종료일로 정의 |
대상의 이름 | 인증서에 기술된, 사람이나 조직과 같은 엔티티. X.500 포맷으로 기록 |
대상의 공개 키 정보 | 인증 대상의 공개 키, 공개키에 사용된 알고리즘, 추가 매개변수 |
발급자의 고유 ID(선택적) | 발급자의 이름이 겹치는 경우를 대비, 인증서 발급자에 대한 선택적인 고유 식별자 |
대상의 고유 ID(선택적) | 대상의 이름이 겹치는 경우를 대비한, 인증 대상에 대한 선택적인 고유 식별자 |
확장 | 기본제약, 인증서 정책, 키 사용 |
인증기관 서명 | 위의 모든 필드에 대한 인증기관의 디지털 서명, 명시된 서명 알고리즘 사용 |
서버 인증을 위해 인증서 사용
- 최신 브라우저는 HTTPS 웹 트랜잭션 시작시에 접속한 서버에서 자동으로 디지털 인증서를 가져옴
- 인증서가 없으면 HTTPS 커넥션은 실패
- 서버 인증서는 다음과 같은 필드를 가지고 있음
– 웹 사이트의 이름과 호스트 명
– 웹 사이트의 공개키
– 서명 기관의 이름
– 서명 기관의 서명 - 브라우저가 인증서를 받으면 서명 기관을 검사
- CA가 신뢰할 만한 기관이면 브라우저는 공개키를 이미 알고 있음
- 공개키를 이용해 서명을 검증
- 서명 기관이 모르는 곳이라면 대화상자를 보여줌
HTTPS의 세부사항
- HTTPS: HTTP의 가장 유명한 보안 버전
HTTPS 스킴
- 스킴:
https://
- (웹 브라우저 등의) 클라이언트는 웹 리소스에 대한 트랜잭션 수행을 요청 받으면 스킴을 우선 검사
- HTTP 스킴이면, 클라이언트는 서버에 80포트로 연결, HTTP 명령 전송
- HTTPS 스킴이면 443포트로 연결, 바이너리포맷로 연결된 핸드셰이크, HTTP 명령 전송
- SSL 트래픽은 바이너리 프로토콜
보안 전송 셋업
- 웹 서버의 443포트(보안 HTTP의 기본 포트)로 연결
- 암호법 매개변수와 교환 키를 협상하며넛 SSL 계층을 초기화
- 핸드셰이크가 완료되면 초기화는 완료
- 클라이언트는 보안 계층에 요청메세지를 보낼 수 있게 됨
SSL 핸드셰이크
- 프로토콜 버전 번호 교환
- 양쪽이 알고 있는 암호 선택
- 양쪽의 신원을 인증
- 채널을 암호화하기 위한 임시 세션키 생성
서버 인증서
- SSL은 서버 인증서, 클라이언트 인증서를 통한 상호 인증을 지원
- 보안 HTTPS 트랜잭션은 항상 서버 인증서를 요구
- HTTPS 인증서는 사이트 정보가 더해진 X.509 인증서
사이트 인증서 검사
- SSL 자체는 사용자에게 웹 서버 인증서를 검증할 요구를 하지 않음
- 최신 웹브라우저들 대부분은 인증서에 대해 간단하게 기본적인 검사를 거침
– 날짜검사: 인증서의 시작, 종료일을 검사
– 서명자 신뢰도 검사: 모든 인증서는 서버를 보증하는 인증 기관(Certificate Authority, CA)에 의해 서명
– 서명 검사: 서명기관의 공개키를 이용해 체크섬을 비교해 봄으로서 인증서의 무결성을 검사
– 사이트의 신원검사: 브라우저는 인증서의 도메인 이름과 대화중인 서버의 도메인이 맞는지 비교
출처: "HTTP 완벽가이드", 이응준, 정상일 옮김, 인사이트, 2014