지난번 글에 http와 https 그리고 ssl에 대해 간략하게 설명을 했었습니다.
다시 설명하면
Http - Hypertext Transfer Protocol 의 약자. Hypertext인 HTML을 전송하기 위한 통신 규약을 의미
Https - S는 Over Secure Socket Layer의 약자로 Secure라는 말을 통해서 알 수 있듯이 보안이 강화된 HTTP. Https는 SSL 위에서 구동되는 프로토콜 중 1개
그럼 SSL은 무엇일까요?
SSL은 보안 소켓 레이어(Secure Sockets Layer, SSL)라고 컴퓨터 네트워크에 통신 보안을 제공하기 위해 설계된 암호 규약이고 현재는 TLS 전송 계층 보안 (Transport Layer Security, TLS)이라 바뀌었습니다.
그리고 SSL은 Certificate Authority(CA)라 불리는 서드 파티로부터 서버와 클라이언트의 인증을 하는데 사용된다. 아래는 SSL이 어떻게 작동하는지에 대한 간단한 과정을 설명한 것입니다.
-
[웹브라우저] SSL로 암호화된 페이지를 요청하게 된다. (일반적으로 https://가 사용된다)
-
[웹서버] Public Key를 인증서와 함께 전송한다.
-
[웹브라우저] 인증서가 자신이 신용있다고 판단한 CA(일반적으로 trusted root CA라고 불림)로부터 서명된 것인지 확인한다. (역주:Internet Explorer나 Netscape와 같은 웹브라우저에는 이미 Verisign, Thawte와 같은 널리 알려진 root CA의 인증서가 설치되어 있다) 또한 날짜가 유효한지, 그리고 인증서가 접속하려는 사이트와 관련되어 있는지 확인한다.
-
[웹브라우저] Public Key를 사용해서 랜덤 대칭 암호화키(Random symmetric encryption key)를 비릇한 URL, http 데이터들을 암호화해서 전송한다.
-
[웹서버] Private Key를 이용해서 랜덤 대칭 암호화키와 URL, http 데이터를 복호화한다.
-
[웹서버] 요청받은 URL에 대한 응답을 웹브라우저로부터 받은 랜덤 대칭 암호화키를 이용하여 암호화해서 브라우저로 전송한다.
-
[웹브라우저] 대칭 키를 이용해서 http 데이터와 html문서를 복호화하고, 화면에 정보를 뿌려준다.
SSL 디지털 인증서
클라이언트와 서버간의 통신을 공인된 제3자(CA) 업체가 보증해주는 전자화된 문서를 말합니다.
SSL 디지털 인증서를 사용할 때의 장점은
- 통신 내용이 공격자에게 노출 방지
- 클라이언트가 접속하려는 서버가 신뢰 할 수 있는 서버인지를 판단
- 통신 내용의 악의적인 변경을 방지
SSL에서 사용하는 암호화 종료
SSL의 핵심은 암호화기 때문에 이 SSL을 사용한 암호화 방식은 다음과 같습니다. (암호를 만드는 행위인 암호화를 할 때 사용하는 일종의 비밀번호를 키(key)라고 합니다. 그래서 이 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모르면 암호를 푸는 행위인 복호화를 할 수 없습니다.)
대칭키
1. 대칭키는 간단하게 하나의 키로 암호화와 복호화(인코딩과 디코딩)을 할 수 있는 암호화 기법을 이야기 합니다.
2. 대칭키의 문제점은 암호를 주고 받는 사람들 사이에 대칭키를 전달하는 것이 어렵다는 점입니다.
3. 대칭키가 유출되면 키를 획득한 공격자는 암호의 내용을 복호화 할 수 있기 때문에 암호가 무용지물이 되기 때문입니다.
4. 이런 배경에서 나온 암호화 방식이 공개키방식입니다.
공개키
1. 공개키 방식은 2가지 키를 가지게 됩니다. 그래서 A키로 암호화를 하면 B키로 복호화 할 수 있고, B키로 암호화하면 A키로 복호화 할 수 있는 방식입니다.
2. 2개의 키는 비공개키(private key, 개인키, 비밀키라고도 부른다)와 공개키(public key)로 지정합니다. 보통 공개키는 디지털 인증서에 포함되어 있습니다.
3. 비공개키는 자신이 가지고 있고, 공개키는 타인에게 제공합니다.
4. 공개키를 제공 받은 타인은 공개키를 이용해서 정보를 암호화한다. 암호화한 정보를 비공개키를 가지고 있는 사람에게 전송합니다.
5. 공개키의 소유자는 이 키를 이용해서 암호화된 정보를 복호화 한다. 이 과정에서 공개키가 유출된다고해도 비공개키를 모르면 정보를 복호화 할 수 없기 때문에 안전합니다. 공개키로는 암호화는 할 수 있지만 복호화는 할 수 없기 때문입니다.
CA
디지털 인증서를 제공하는 공인된 기업 (Certificate Authority 혹은 Root Certificate)
사설 인증기관
개발이나 사적인 목적을 위해서 SSL의 암호화 기능을 이용하려한다면 자신이 직접 CA의 역할을 할 수도 있다. 물론 이것은 공인된 인증서가 아니기 때문에 이러한 사설 CA의 인증서를 이용하는 경우 브라우저는 아래와 같은 경고를 출합니다.
공인된 CA가 제공하는 인증서를 사용한다면 브라우저의 주소창이 아래와 비슷한 모양을 보여줍니다.
이렇게 되는 이유는 브라우저는 내부적으로 CA의 리스트를 미리 파악하고 있어서, 그 리스트에 포함되어야만 공인된 CA로 브라우저가 인식합니다. 즉, CA의 리스트와 함께 각 CA의 공개키를 브라우저는 이미 알고 있습니다.
SSL 인증서의 서비스 보증방법과 동작 방법
SSL 인증서의 내용
SSL 인증서는 다음의 내용을 포함하고 있습니다.
- 서비스의 정보 (인증서를 발급한 CA, 서비스의 도메인 등등)
- 서버 측 공개키 (공개키의 내용, 공개키의 암호화 방법)
SSL 인증서의 서비스 보증방법
이미 위에서 업급했지만 다시한번 설명하겠습니다.
1. 웹 브라우저가 서버에 접속할 때 서버는 제일 먼저 인증서를 제공한다.
2. 브라우저는 이 인증서를 발급한 CA가 자신이 내장한 CA의 리스트에 있는지를 확인한다.
3. 확인 결과 서버를 통해서 다운받은 인증서가 내장된 CA 리스트에 포함되어 있다면 해당 CA의 공개키를 이용해서 인증서를 복호화 한다.
4. CA의 공개키를 이용해서 인증서를 복호화 할 수 있다는 것은 이 인증서가 CA의 비공개키에 의해서 암호화 된 것을 의미한다. 해당 CA의 비공개 키를 가지고 있는 CA는 해당 CA 밖에는 없기 때문에 서버가 제공한 인증서가 CA에 의해서 발급된 것이라는 것을 의미한다.
5. CA에 의해서 발급된 인증서라는 것은 접속한 사이트가 CA에 의해서 검토되었다는 것을 의미하게 된다. CA의 검토를 통과했다는 것은 해당 서비스가 신뢰 할 수 있다는 것을 의미한다.
SSL의 동작방법
SSL은 암호화된 데이터를 전송하기 위해서 공개키와 대칭키를 혼합해서 사용합니다. 즉 클라이언트와 서버가 주고 받는 실제 정보는 대칭키 방식으로 암호화하고, 대칭키 방식으로 암호화된 실제 정보를 복호화할 때사용할 대칭키는 공개키 방식으로 암호화해서 클라이언트와 서버가 주고 받는다.
- 실제 데이터 : 대칭키
- 대칭키의 키 : 공개키
컴퓨터와 컴퓨터가 네트워크를 이용해서 통신을 할 때는 내부적으로 3가지 단계가 있다. 아래와 같다. (악수라는게 이상한 것 같지만 정말 사용되는 용어입니다. 사실은 악수가 아니라 hand shake라서 우리나라에서는 악수라고 하는것 같습니다.)
악수->전송->세션종료
악수: 서로를 확인하는 부분입니다. 즉 SSL 방식을 이용해서 통신을 하는 브라우저와 서버 역시 악수를 할 때 SSL 인증서를 주고 받는다.
세션: 실제로 서버와 클라이언트가 데이터를 주고 받는 단계이다. 이 단계에서 핵심은 정보를 상대방에게 전송하기 전에 session key 값을 이용해서 대칭키 방식으로 암호화 한다는 점이다. 암호화된 정보는 상대방에게 전송될 것이고, 상대방도 세션키 값을 알고 있기 때문에 암호를 복호화 할 수 있다.
세션 종료 : 데이터의 전송이 끝나면 SSL 통신이 끝났음을 서로에게 알려준다. 이 때 통신에서 사용한 대칭키인 세션키를 폐기한다.
자세한 설명은 생활코딩에서 확인하는 것이 더 좋을 것 같습니다.
그리고 다음은 SSL 통신과정을 표현한 그림입니다.
참고
https://ko.wikipedia.org/wiki/%EC%A0%84%EC%86%A1_%EA%B3%84%EC%B8%B5_%EB%B3%B4%EC%95%88
https://opentutorials.org/course/228/4894
https://wayhome25.github.io/cs/2018/03/11/ssl-https/
https://wiki.kldp.org/HOWTO/html/SSL-Certificates-HOWTO/x70.html
http://boansecurity.blogspot.com/2017/01/network-ssl-tls.html
'2023년 이전 > Web&Server' 카테고리의 다른 글
NodeJs란 ? 그리고 왜 사용하였는가? (0) | 2019.12.02 |
---|---|
Docker에서 mySql 실행하기 - container 접속하기 (0) | 2019.12.02 |
Docker 실행 해보기! (0) | 2019.12.02 |
Docker - Docker란 무엇이고 왜 사용했는가? (0) | 2019.12.02 |
OpenSSL을 사용해서 Https 서버 open (3) | 2019.11.28 |