https://github.com/WeareSoft/tech-interview/blob/master/contents/network.md 의 내용을 다룸
HTTP와 HTTPS의 가장 큰 차이점은 SSL 인증서이다. SSL인증서는 클라이언트와 서버간의 통신을 공인된 제 3차 업체(CA)가 보증해주는 전자화된 문서이다.
그럼 어떻게 암호화 해야하지?
암호화를 하는 방식은 크게 두가지로 나눌 수 있다.
대칭형 방식은 양쪽 당사자가 공유한 시크릿에 의존하는데, 전송자는 정보를 암호화하는 데 사용하고 수신자는 동일한 방식과 키를 사용해 복호화한다. 이 방법의 문제는 양쪽 당사자가 서로 물리적인 만남 없이 시크릿을 협상(교환)하는 방법이라서 일종의 보안 통신 채널이 필요하다.
공개 키와 개인 키의 개념을 기반으로 하는 비대칭 방식은 대칭 방식의 문제를 해결한다. 두 가지 키 중 하나로 평문을 암호화하면 다른 보완 키를 사용해야만 복호화할 수 있다. 이를테면 서로 안전하게 통신하고 싶은 두 당사자 앨리스와 밥이 있다고 가정하자(앨리스와 밥은 모든 튜토리얼과 보안 매뉴얼에 항상 등장하는 허구의 인물이므로 여기서는 그러한 전통을 따랐다). 앨리스와 밥은 공개 키와 개인 키의 쌍을 가졌다. 개인 키는 각 소유자만 알고 있으며 공개 키는 누구든 사용할 수 있다.
공개키 방식 (PKI, Public Key Infrastructure)은 암호화, 복호화시킬 수 있는 서로 다른 키(공개키, 개인키)를 이용한 암호화 방법이다.
⇒ A키로 암호화를 하면 B키로 복호화를 할 수 있고, B키로 암호화를 하면 A키로 복호화를 할 수 있다.
⇒ 단점 : 대칭키보다 느리다.
⇒ ex ) RSA
HTTPS를 지원하는 서버에 요청을 하려면 공개키다 필요하다.
- 그럼 이 공개키를 어떻게 공개키 저장소에서 가져올까?
- 또한 공개키는 누구나 얻을 수 있고, 공개키를 알면 서버가 주는 데이터(Reponse)는 아는데 보안상 의미가 있을까?
⇒ 결론 : 보안상의 의미는 없다.
⇒ 대신 해당 서버로 부터 온 응답임을 확신할 수 있다. 왜냐면 공개키로 해독이 가능한 것은 해당 서버의 개인키로 암호화했다는 것을 보장하기 때문이다.
HTTPS 통신에서는
처리 속도가 느린 문제를 해결하고 있다.
전자서명이란 서명자를 확인하고 서명자가 했다는 사실을 나타내는데 이용하려고 특정 전자문서에 첨부되거나 논리적으로 결합된 전자적 형태의 정보이다.
→ 말그대로 서명하는것 / 서명을 통해서 서명한 사람을 확인하는 용도로 사용하는 것이다.
→ 공개키 암호를 이용하면 통신간의 인증 및 변조 검증이 가능하다.
디지털 서명은 해싱→서명→검증 세가지의 기본 단계로 나뉜다.
서명은 공개키기반구조(PKI)라는 구조를 형성하여 서로간의 인증을 통해 신뢰를 형성하는 방식이다. 서명방식에서는 개인키로 데이터를 암호화한다.
아래그림에서 앨리스가 메세지를 보낼때, 원본 message를 hash한 값을 자신의 개인키로 암호화 하여 전자 서명을 생성하여 message와 함께 밥에게 보낸다.
밥은 앨리스의 공개키를 이용해서 해당 서명을 복호화하여(decryption) 나온 해시값과 원본 message를 해시하여 나온 값을 비교한다. 이 값이 일치하면, 서로 통신 간의 데이터 변조가 일어나지 않음을 검증할 수있다.
🔥🔥 하지만, 전자 서명만으로는 공개키 소유자에 대한 인증이 불가능하다.
아래 그림은 공개키 암호방식과정이다. 데이터 암호에는 메시지를 받을 사람(Alice)의 공개키로 암호화를 수행하여 보냈다. 하지만 만약에 해커가 앨리스의 공개키를 가로채고 본인의 공개키로 보냈다고 생각해보자.
밥은 그러면 해커릐 공개키로 암호화하여 보낼 것이고, 해커는 자신의 개인키로 복호화하여 그 내용을 볼 수 있다.
⇒ 공개키 기반의 암호화가 완벽하지만 공개키의 유효성이 확인되지 않으면 무용지물이다.
⇒ 그래서 탄생한 것이 PKI기반의 인증서체인 (Cert Chain)형태이다.
공개키 기반구조로, 인증서를 통해 서로 신뢰할 수 있는 구조이다.
PKI의 최상위에는 인증기관인 CA(Certificate Authority) 가 있다. CA는 공개키저장소라고도 불리며 민간기업이지만 아무나 운영할 수 없고 검증된 기업만 CA를 운영할 수 있다.
Step 1-3
이 CA에 공개키가 자신의 것이라는 것을 보증하기 위해 등록을 한다. CA에 공개키를 주면 CA가 공개키와 각종 정보들을 포함하여 cert
를 구성해준다. 이렇게 생성된 인증서는 서명(Signature)
와 함께 전달하게 된다.
인증서에 서명값이 포함된다고 보면된다.
cert
) = 공개키(public key
) + 공개키 해시(public key hash
) + 서명값(signature
) + 기타Step 4. 앨리스는 전달받은 서명값(signature)
을 확인한다.
Step 5. (Verification) Step4에서 구한 CA의 공개키를 이용해서 복호화해 나온 앨리스의 공개키에 대한 해쉬값
과 인증서에 있는 공개키 해쉬 값
을 비교하여일치하는지 판단
이러한 과정을 걸친 앨리스는 자신의 공개키에 대한 인증서를 가지고 있기 때문에 밥과 통신 시 이 인증서(서명값 포함)만 전달하면 된다. 밥도 마찬가지로 자신의 공개키에 대한 인증서를 가지고 있으면 앨리스에게 전달하여 서로간의 신뢰할 수 있는 통신을 할 수 있다.
사실 CA로 부터 인증서를 바로 발급받는 일은 거의 없다. PKI 에서 사실 CA는 최상위 기관이며, CA에서 모든 개인에게 모든 인증서를 발급해주기에는 무리가 있기 때문이다. 그래서 인증서 체인 형태로 관리하게 된다.
HTTPS 통신은 제 3자 인증을 사용합니다. 인증기관으로부터 인증서를 발급받아서 서버에 설치해야 경고없이 HTTPS 통신이 가능합니다.
인증기관의 인증을 받았다는 것은 웹서비스를 제공하는 소유자를 보증해준다는 의미다. 자세히는 웹 서비스 제공자의 공개키가 소유자의 것이라는 것을 보증해주는 말과 같다.
인증서는 공개키의 유효성, 무결성을 보증한다
위에서 이야기한 내용을 HTTPS 로 설명하자면
웹 브라우저에는 이미 여러 인증기관의 공개키를 포함한 인증서가 설치되어 있다. 그래서 웹서버와 통신 시 인증기관의 개인키로 서명된 인증서를 받았을 때 이미 설치되어 있는 인증기관의 공개키로 복호화가 가능한것.
개발 목적이나 내부에서 사용할 목적으로 사설 인증서를 만들 경우 웹 브라우저에 인증서를 수동으로 설치해야만 경고 없이 통신이 계속 가능하다.
두가지 기준으로 HTTPS 인증서를 나눠보고자 한다.
1. 신원검증
2. 다루는 도메인의 수
DV (Domain validated) : 가장 일반적인 유형의 인증서인 DV 인증서
EV (Extended validation)
OV (Organization validated)
example.com
과 www.example.com와 같은
도메인 이름에 유효하다..example.com
)의 수를 제한 없이 다룬다(예: example.com
, www.example.com
, mail.example.com
, ftp.example.com
등). 제한 사항은 주 도메인의 하위 도메인만 다룬다는 점이다.