HTTP (Hypertext Transfer Protocol)
웹에서 통신할 때 사용하는 가장 기본적인 프로토콜
클라이언트와 서버가 주고 받는 메세지의 형식에 대한 약속이다.
1. 평문 통신이므로 도청이 가능하다.
HTTP는 서버에서 브라우저로 전송되는 정보가 암호화되지 않는다.
암호화 하지 않은 평문을 보내기 때문에 제 3자가 훔쳐볼 수 있다.
2. 완전성을 증명할 수 없으므로 변조가 가능하다.
HTTP는 메세지가 중간에 변경되어도 알 수 없다.
클라이언트에서 메세지를 보내도 공격자가 메세지를 변경해도 서버는 받은 메세지가 변경이 된지 알 수 없고
클라이언트도 자신이 보낸 원본의 메세지가 잘 도착되었는지 알 수 없다.
3. 통신 상대를 확인하지 않으므로 위장이 가능하다.
HTTP는 올바른 상대와 통신하고 있는지 알 수 없다.
서버에서는 요청이 날라왔을 때 권한이 없는 클라이언트로 부터 온 것인지 알 수 없고
클라이언트도 본인이 진짜 웹 서버에게 보내고 있는 것인지 위장한 웹 서버에게 보내고 있는 것인지 알 수 없다.
HTTPS (Hypertext Transfer Protocol Secure)
SSL(보안 소켓 계층) 사용
SSL은 클라이언트와 서버 사이에 안전하게 암호화된 연결을 만들 수 있게 도와줌.
클라이언트와 서버가 민감한 정보를 주고받을 때 해당 정보가 도난당하는 것을 막아줌.
HTTPS는 HTTP에서 정보가 암호화되지 않는다는 문제를 SSL을 활용해서 해결하였다.
HTTP를 사용해서 운반하는 내용 즉, HTTP 메세지 바디를 암호화한다.
SSL/TLS (Secure Sockets Layer / Transport Layer Security)
Netscape Communications Corporation에서 웹 서버와 웹 브라우저간의 보안을 위헤 만든 프로토콜이다.
SSL / TLS 이라는 다른 프로토콜을 조합하여 안전한 통신로를 확립한다. SSL은 공개키/개인키, 대칭키 방식을 혼합하여 사용한다.서버와 브라우저간 전송되는 데이터를 외부의 공격자로부터 보안하기 위해 필요하다. 암호화의 대상은 내용이 유출되었을 때 악용되어 사용될 수 있는 비밀번호나 개인정보 등이 해당된다.
대칭키
- 대칭키 방식은 동일한 키로 암호화/복호화를 수행하는 방법이다.
- 누구든지 암호화에 이용된 키를 가지고 있으면 해당 데이터를 쉽게 복호화할 수 있다.
공개키
- 공개키 방식은 서로 다른 키로 암호화/복호화를 수행하는 방법이다.
- 그래서 공개키는 비대칭키 방식으로도 불린다.
- 데이터 암호화 시에는 공개키를 사용하고 복호화 시에는 개인키를 사용한다.
- 서버측에서 개인키를 보관하고, 암호화된 데이터를 해독할 수 있는 곳은 서버뿐이다.
- 공개키로 암호화된 데이터는 오직 개인키로만 복구할 수 있기 때문에 누구든지 공개키를 가져도 상관이 없다.
- 즉, 중간에 해커가 가로챈다 하여도 문제가 되지 않는다.
대칭키 방식은 암호화/복호화가 쉽다는 장점을 가지고 있다. 반면에, 결국 한번은 한쪽에서 다른 쪽으로 키를 전송해야 하는데 중간에 누가 이것을 훔쳐본다면 소용없기 때문에 키를 공유할 때 문제가 생길 수 있는 단점을 가지고 있다. 공개키 방식은 공개키를 얼마든지 공유해도 되기 때문에 키 배송에는 문제가 없지만 대칭키 방식보다 암호화/복호화 연산시간이 더 소요되어 비용이 크다는 단점이 있다. 그래서 SSL은 각 방식이 가진 단점 때문에 하나의 방식만 채택해 사용하지 않고 두 방식을 적절히 섞어 사용하게 된다.
SSL 통신 과정
SSL은 공개키 방식으로 대칭키를 전달한다. 이 대칭키를 활용해서 암호화/복호화를 하고 서버와 브라우저간의 통신을 진행한다.
A에서 B로 접속 요청을 보낸다.
이때, B는 A에게 자신의 공개키를 전송한다.
A는 자신의 대칭키를 B에서 전달받은 B의 공개키로 암호화한다.
이렇게 암호화 한 대칭키를 B에게 전달한다.
B는 A의 대칭키를 자신의 개인키로 복호화한다.
이 복호화한 결과로 B는 A의 대칭키를 얻어낼 수 있다.
이렇게 얻어낸 대칭키를 활용해서 A와 B는 안전하게 통신한다.
즉, 데이터 암호화/복호화를 위한 한쪽의 대칭키를 다른쪽의 공개키로 암호화하여 전송하면 반대편에서 자신의 개인키로 복호화하여 그 반대편의 대칭키를 알아내고 이 대칭키를 바탕으로 서로 통신하게 된다.
공개키 암호화의 문제점
- 공개키가 진짜인지 아닌지 증명할 수 없다.
- 신뢰할 수 있는 기관에서 서버의 공개키만 검증해준다면 클라이언트는 안전하게 웹사이트를 이용할 수 있을 것이다.
- 서버가 우리에게 공개한 공개 키가 정품인지를 확인할 수 있어야 한다.
- 이걸 인증해주는 공인된 민간기업들이 있다. Certificate Authority, 줄여서 CA 라고 부른다.
SSL 인증서
- 사이트는 사이트 인증서가 필요하다.
- 사이트 인증서는 인증기관(CA)에서 사이트에게 발급해주는 문서이다.
- 이를 위해 사이트에서 인증기관에게 사이트 정보와, 사이트 공개키를 전달한다.
- 인증기관에서는 사이트 인증서를 발급하기전에 전달받은 데이터를 검증한다.
- 인증기관에서 성공적으로 검증을 완료하면 인증기관은 사이트 인증서를 생성하기 위해 이 데이터를 자신의 개인키로 서명한다.
- 서명을 하고나면, 사이트 인증서가 생성이되고, 생성한 인증서를 사이트에게 전달한다.
- 인증기관은 사용자에게 자신의 공개키를 전달한다.
- 이때, 사용자가 인증기관으로부터 전달받은 인증기관의 공개키는 사용자 브라우저에 자동으로 내장된다.
- (대부분의 브라우저에서는 공신력있는 CA들의 정보와 CA가 만든 공개키가 이미 설치되어있다.)
정리
- 서버는 SSL 인증서를 제공한다. 이 인증서에는 서버측의 공개키와 서비스의 정보(도메인)를 담고있다.
- 브라우저는 이 인증서를 발급한 CA가 자신의 CA리스트에 있는지 확인한다.
- 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화한다.
복호화가 된다면 이 인증서는 CA의 비공개키에 의해 암호화 되었다는 것을 알 수 있다
SSL 핸드쉐이크 (SSL Handshake)
클라이언트와 서버가 안전한 연결을 설정하기 위해 수행하는 초기 과정이다.
이 과정에서 암호화 방식, 인증, 키 교환 등이 이루어진다. HTTPS 통신의 핵심 단계로, 안전한 데이터 전송을 가능하게 합니다.
SSL 핸드쉐이크의 주요 목적
- 서버와 클라이언트의 신원 확인
- 서버 인증 (필수)
- 클라이언트 인증 (선택)
- 암호화 방법 협상
- 사용할 암호화 알고리즘과 키 교환 방식 결정.
- 세션 키 교환
- 데이터를 암호화/복호화할 대칭 키를 공유.
SSL 핸드쉐이크 과정
- client Hello: client에서 SSL버전 정보와 지원하는 암호화 방식, 무작위 바이트 문자열(이후에 사용하게 되는 중요한 데이터입니다)이 포함 되어 전달된다. 이미 SSL handshake를 했었다면 세션을 재사용 할 수 있다.
- server Hello: 지원하는 암호화 방식 중 서버에서 어떤것을 사용할 지, 세션 ID, 서버측에서 생성한 무작위 바이트 문자열을 전송한다. 클라이언트에서 인증서를 요구하게 되면 SSL 인증서를 전송하게 된다.
- 인증서를 받게 되면 해당 CA의 공개키를 이용해서 인증서를 복호화하고 신뢰할 수 있는 사이트 인지 판단하게 된다. 이 과정을 통해 클라이언트는 공개키를 얻게 된다.
- 이후 클라이언트는 자신이 만든 무작위 바이트 문자열과 서버쪽에서 전송된 무작위 바이트 문자열을 조합하여 pre-master secret키를 생성한다. 이 키는 이후 데이터를 주고 받을 때 대칭키 방식을 사용할 때 사용하게 된다. 이 pre-master secret키를 서버로 전송할 때 인증서에서 받았던 키를 이용하여 공개키 방식 암호화를 하게 된다. 그리고 서버쪽으로 전송하게 된다.
- 서버쪽에서는 수신한 pre master secret키를 비밀키를 이용하여 복호화 하여 얻게 된다.
- server client 둘 다 일련의 과정을 거쳐 pre-master secret키를 master key로 만들게 되고 이 master key를 이용하여 session key를 만들게 된다. 이후 데이터를 주고 받을 떄 session key를 대칭키 방식으로 이용하여 통신하게 된다.
- 통신이 끝나면 세션키를 폐기한다.
요약한 과정
1. 클라이언트 헬로 (Client Hello)
클라이언트가 서버에 다음 정보를 전송
- 지원하는 암호화 방식 목록 (예: RSA, AES)
- 사용할 TLS 버전
- 난수(랜덤 데이터) ClientRandomClient Random
- 세션 ID (이전 세션 재활용 시)
2. 서버 헬로 (Server Hello)
서버가 클라이언트에 응답하며 전송:
- 선택한 암호화 방식
- 사용할 TLS 버전
- 난수(랜덤 데이터) ServerRandomServer Random
- 세션 ID
3. 서버 인증 및 키 교환:
- 서버는 SSL/TLS 인증서를 클라이언트에 전송:
- 인증서에는 서버의 공개 키와 신뢰 기관(CA)의 서명이 포함.
- 클라이언트는 CA를 신뢰하는지 확인.
- 서버는 공개 키를 사용해 클라이언트가 보낼 데이터를 복호화할 준비를 함.
4. 클라이언트 키 교환 (Client Key Exchange)
- 클라이언트는 서버의 공개 키를 사용해 프리마스터 시크릿 (Pre-Master Secret)을 암호화하여 서버에 전송.
- 서버는 자신의 비공개 키로 이를 복호화해 대칭 키를 생성.
5. 세션 키 생성
- 클라이언트와 서버는 Pre-Master Secret, Client Random, Server Random을 사용해 세션 키를 생성.
- 이 세션 키는 이후의 통신을 암호화하는 데 사용.
6. 완료 메시지 교환
- 클라이언트와 서버는 각각 "핸드쉐이크 완료" 메시지를 교환.
- 이후 암호화된 통신 시작.
과정 예시)
사용자가 사이트에 접속을 요청한다.
사이트는 자신이 신뢰할 수 있는 사이트임을 증명하기 위해 사용자에게 자신의 인증서를 전달한다.
사용자는 브라우저에 내장되어 있는 인증기관 공개키로 사이트 인증서를 복호화하여 검증한다.
사이트 인증서를 해독하면 사이트 정보와 사이트 공개키를 얻을 수 있다.
이렇게 얻은 사이트의 공개키로 사용자는 자신의 대칭키를 암호화 하고 사이트에게 전달한다.
이어서 사이트는 자신의 개인키로 사용자로부터 전달받은 암호문을 해독하여 사용자의 대칭키를 얻는다.
이렇게 얻은 대칭키를 이용하여 사용자와 사이트는 암호문을 주고받을 수 있게 된다.
즉, SSL 통신을 하게 된다. SSL은 사이트 외의 인증기관과 사용자도 협력하기 때문에 안전한 접속 방법이 된다.
'Network' 카테고리의 다른 글
[Network] 프록시 서버 (0) | 2024.12.17 |
---|---|
[Network] DNS (0) | 2024.12.03 |
[Network] HTTP 버전별 특징 (0) | 2024.11.24 |
[Network] Stateful vs Stateless (2) | 2024.11.24 |
[Network] 프로토콜과 OSI 7 Layer (0) | 2024.11.24 |