[Network] 서비스의 보안을 위해 어떻게 CIA를 지킬 수 있을까?(2) - RSA로 해결
이전 글에서는 CIA에 관한 설명과 CIA를 지키기 힘들 수 밖에 없는 이유에 관해 글을 작성했었습니다.
이번 글은 CIA를 지키기 위한 방법 RSA에 관해 글을 작성해보도록 하겠습니다.
RSA란?
RSA는 공개키 암호시스템의 하나입니다. 암호화 뿐만아니라 전자서명이 가능한 최초의 알고리즘으로 알려져있고,RSA가 갖는 전자서명 기능은 인증이 필요한 전자상거래 등에 광범위하게 사용되고 있습니다.
RSA는 public key(공개키), private key(비밀키)가 존재합니다. 이것을 기반으로 이 전글에서 CIA를 지킬 수 없었던 문제에 관해 해결하는 법을 작성해보도록 하겠습니다.
우선 이전 글에서 A에서 B로 정보를 보낼 때,
정보 전달 문제
- A에서 B로 정보를 보낼 때, C가 정보를 탈취해가는 것
누가 보냈는지에 관한 인증 문제
- C가 정보를 탈취했지만, 정보가 금고안에 있어서 C가 정보를 볼 수 없었다. 그래서 C가 허위된 새로운 정보를 새로 만들어서 B에게 보냈다. B 입장에선 이게 A에게서 온건지, C에게서 탈취된 후 새롭게 만들어진 허위 정보로 온건지 알 수가 없다. 즉, 누가 보냈는지에 관해 정확히 믿을 수 없다.
두 가지가 있었습니다. 이 문제를 RSA로 어떻게 해결할까요?
1. 정보 전달 문제 해결
1. A와 B는 각각의 개인키, 공개를 가지고 있도록 합니다. 그리고 A는 정보를 B의 공개키에 담아서 B에게 전달합니다.
- 그럼 여기서 이런 궁금증이 생길 수 있습니다 .어떻게 A는 자신의 키가 아닌 B의 공개키에 정보를 담아서 보낼 수 있을까요? 공개키는 블로그나 외부에 노출되어도 상관없는 키 입니다. 따라서 A는 B에게 공개키를 알 수 있고, B의 공개키에 담아서 전달합니다.
2. 공개키는 개인기(비밀키)로만 풀 수 있습니다. 따라서 B는 자신의 개인 키를 이용하여 A가 보낸 키를 풀어서 정보를 받습니다. 이 과정에서 C는 B의 공개키를 탈취해서 B의 개인키를 가지고 있을 수 없기 때문에 B의 공개키를 풀 수 없습니다.
하지만, 이 경우도 문제가 존재합니다. C가 정보를 열어볼 수 없다고 한들, 새로운 허위 정보를 만들어서 C가 B에게 보내면, B 입장에서는 위에서 말한 누가 보냈는지에 관한 인증 문제를 해결할 수 없겠죠? 이건 아래에서 다시 설명하도록 하겠습니다.
누가 보냈는지에 관한 인증 문제를 해결하기 전에 잠깐, 왜 정보를 공개키에만 담아서 보내나요? 개인키에 담아서 보내면 안돼나요?
공개키를 개인키로 풀 수 있는 것처럼, 개인키도 공개키로 풀 수가 있습니다. 따라서, 개인키에 담아 보내게 되면 위에서 말한 것처럼 공개키 특성상 C가 공개키를 알게 되어 개인키를 풀 수도 있겟죠?
개인키에 담으면 이러한 문제점이 있긴하지만, 자주 쓰이기도 합니다. 주로 전자서명에 쓰이죠. 잠시 A가 자신의 개인키에 정보를 담아서 B에게 보냈다고 가정해보겠습니다.
전자서명 같은 경우에는 단순히 중요하지 않는 정보를 들고 있기도하고, B는 단순히 A가 보냈다는 것만 알면 문제될게 없습니다. 따라서 C가 탈취해서 A의 공개키로 A의 개인키를 풀어 정보를 본다고 한들 의미가 없습니다.
단지 중요한건, B 입장에서는 A가 보낸게 확실하다는 것만 알면돼죠. 이 경우에는 A의 개인키에 담겨져 있는 정보를 A의 공개키로만 풀 수 있습니다. B나 C의 공개키로는 풀어 볼 수가 없죠. B는 A의 공개키를 알 수 있기 때문에, A의 공캐키로 A의 개인키를 풀어서 정보를 본다면 A가 보낸게 확실하다는 것을 알 수 있겟죠? A의 개인키는 A의 공개키로만 풀 수 있으니 말입니다.
즉, 공개키로 잠궈서 개인키로 푸는 방식은 암호화에 주로 쓰이고, 개인키로 잠궈서 공개키로 푸는 것은 전자문서 서명 등에 사용이 됩니다.
위 처럼, 개인키로 잠궈서 공개키로 푸는 방법은 전자서명이 아닌 중요한 정보가 들어있다면 이 방법은 굉장히 위험한 방법이겠죠?
2. 누가 보냈는지에 관한 인증 문제 해결
그럼 이제 다시 1번에서 말한 누가 보냈는지에 관한 인증 문제를 해결하는 법을 작성해보도록 하겠습니다.
1. 정보가 들어있는 B의 공개키를 A의 개인키에 한 번 더 담슴니다.
2. B는 문서를 받으면 A의 공개키로 A의 개인키를 우선 열어봅니다.
- 열리면? 인증(o)
- 안 열리면? (인증 x)
3. 열린다면 B의 개인키로 B의 공캐키를 열어봅니다.
- 정보를 확인 할 수 있다.
이런 방식으로 진행하게 되면, B가 A의 공개키로 A의 개인키가 열리면 인증이 가능하고 , 인증이 되면 B의 개인키로 B의 공개키를 열어볼 수 있으니 정보를 알 수 있게 됩니다.
이렇게 공개키를 개인키로 한 번더 감싸서 보내는 방식으로, 이전 글에서 말씀드렸던 정보 전달 누가 보냈는지에 관한 인증 문제는 RSA로 해결할 수 있게 됩니다. 이것은 우리가 JWT를 사용하기 전에 JWT를 왜 사용하는가에 관해 꼭 알아야할 개념이라고 생각합니다.