node-postgres 공식 문서를 보던 도중에 내 입장에서는 뜬금없는 단어가 튀어나왔다.
그것은 바로 SSL. 예전에 HTTP/HTTPS 웹 수업을 듣던 도중 SSL 이라는 것을 듣고
나중에 자연스럽게 알게되겠지~ 하고 넘겼던 바로 그 녀석이 DB 공부를 하면서 나오다니,
올것이 왔구나 하는 생각이 들었다.
생각해보면 DB 도 결국에는 서버이기 때문에 추가로 보안적인 요소들이 필요할 법이다.
이 보안적인 요소를 위해서 SSL 이 쓰이는 것인가? 하는 질문에서 부터 이 글이 시작되었다.
가장 먼저, SSL 이 무엇인지 부터 알아보자.
SSL 은 Secure Sockets Layer 의 약자로, 그 이름에서 부터 역시나 보안적인 아우라를
풀풀 풍기는 친구이다. 암호화 기반 인터넷 보안 프로토콜이라고 정의 되어있다.
현재 사용중인 TLS 암호화의 전신이라고 불리우는 SSL 에 대해서 살펴보자
SSL/TLS 인증서에는 다음과 같은 정보들이 포함된다.
브라우저는 먼저 SSL/TLS 인증서를 사용하여 SSL/TLS handshake 를 통해 웹 서버와 보안 연결을 시작한다.
원래 웹 상의 데이터는 메시지를 가로채면 누구나 읽을 수 있는 일반 텍스트 형태로 전송됐습니다. 가령 고객이 쇼핑 웹사이트를 방문하여 주문하고, 신용 카드 번호를 입력했다고 하면, 해당 신용 카드 번호가 숨겨지지 않은 채 인터넷을 이동하게 됩니다.
SSL은 이 문제를 바로잡고, 사용자 개인 정보를 보호하기 위해 제작됐습니다. SSL은 사용자와 웹 서버 사이를 이동하는 모든 데이터를 암호화하여, 누군가 데이터를 가로채더라도 무작위 문자만 볼 수 있게 합니다. 이제 고객의 신용 카드 번호는 안전해졌으며, 고객이 번호를 입력한 쇼핑 웹사이트만 이를 볼 수 있습니다.
SSL은 특정한 유형의 사이버 공격도 차단합니다. SSL은 웹 서버를 인증하는데, 공격자들이 사용자를 속여 데이터를 훔치기 위한 가짜 웹사이트를 만드는 일이 있기 때문에, 이러한 인증이 중요합니다. 또한 약병의 조작 방지 봉인처럼, 공격자가 전송 중인 데이터를 조작하지 못하게 막기도 합니다.
더 알아볼 내용
caching_sha2_password / mysql_native_password
어제 SSL 에 관한 이야기를 마저해보려 한다.
내가 velog 에 접속하는 것 처럼 client 가 어떤 사이트에 접속했을 때,
그 사이트가 믿을만한 사이트인지 어떻게 알까?
우리가 velog 에 접속하면 다양한 정보들을 제공한다. 회원가입을 위한 개인정보와
차후에 제공하는 다양한 데이터들이 있다. 이 정보들이 불순한 목적을 갖고 만들어진
사이트에 제공된다면 어떻게 될까? 혹은, 정상적인 사이트로 전달되던 도중
패킷이 공격자들에 의해 탈취되어 데이터들이 유출된다면 어떻게 될까? 이것은 신뢰성 있는
인터넷을 만들기 위해서 반드시 해결되어야 하는 문제였다.
여기서 등장하는 것이 인증서의 개념이다.
우리가 인증서를 사용하는 경우는 무엇이 있을까? 보통은 은행 업무를 보는 것과 같이
개인의 신원 확인이 중요할 때 공인인증서와 같은 방법을 사용한다.
여기에서 말하는 인증서도 마찬가지 이다. 다른 점은 여기서 인증서의 대상이 사이트 라는 것이다.
전 세계적으로 신뢰 가능한 Geotrust 와 같은 회사가 인증서를 발급하는 역할을 한다.
그렇다면 인증서의 인증은 어떻게 진행할까?
Geotrust 와 같은 회사들의 public key 는 대부분의 사람들의 컴퓨터에 내장되어 있다.
그래서 만약 google 에서 인증서를 발급 받기를 원한다면,
google 은 geotrust 에 자신들의 데이터를 종합해 해시화한 값을 geotrust 의
private key 를 통해서 함호화 해 달라고 요청한다.
그러면 geotrust 는 자신들의 private key 를 통해서 암호화 한다.
사용자들의 입장에서는 자신들은 geotrust 의 public key 를 갖고 있기 때문에, 만약
자신들이 갖고 있는 public key 로 복호화 할 수 있는 인증서가 있다면 이것이 geotrust가
발급한 인증서임을 알 수 있는 것이다. 그래서 geotrust 가 인증한 회사라면 google 도 믿을 수 있게 되는 것이다. 이러한 원리를 Chain of trust 라고 부른다.
상위 계층의 인증서(Geotrust) 가 신뢰할 수 있는 기관이라면,
해당 인증서(Geotrust)의 비밀키로 암호화된 하위 인증서(Google) 또한 신뢰 가능하다고 간주하는 것이다.
위의 순서는 이해가간다. 하지만 그냥 데이터를 바로 암호화 하면 되지 왜 한번 해시화한 값을
암호화 할까? 이는 데이터 변조를 잡아내기 위함이다. 만약 우리가 public key 로 데이터를
복호화해서 기존 데이터의 해시값을 얻었다고 가정해보자. 하지만 만약에 얻은 해시값과
인증서에 들어있는 내용물을 다시 해시값으로 만든 값이 다르다면 어떨까?
이는 인증서의 내용물이 변조되었음을 의미한다!
그렇기 때문에 해시화를 한번 해서 암호화를 한다면 데이터의 변조 또한 잡아낼 수 있게되는 것이다.
[aws article about ssl] https://aws.amazon.com/ko/what-is/ssl-certificate/