[웹 보안] RSA
JWT를 이해하기 전 RSA에 대해 간단히라도 알고 있는 것이 좋다.
RSA 암호는 두 가지의 키를 가지고 있다.
- Public Key : 공개키
- Private Key : 개인키
각 사용자는 자신의 공개키와 비밀키를 가지고 있다. 그리고 이 공개키는 말 그대로 공개되어도 괜찮은 키이다. 따라서 A 사용자가 B의 공개키를 통해 암호화할 수 있다. 이렇게 B의 공개키로 암호화되면 이것은 B의 개인키로만 복호화를 할 수 있다.
메시지의 내용이 노출되어도 상관없고 누가 보냈는 지가 더 중요한 경우가 있을 수 있다.
A가 B에게 'A가 C에게 1억을 송금했다.'라는 메시지를 보낸다고 하자. 그러면 A는 이 메시지를 A의 개인키로 암호화해서 보낸다. A의 개인키로 암호화하면 A의 공개키로 열어 볼 수 있다.
A의 공개키는 누구나 가질 수 있기 때문에 해커 역시 이를 열어 볼 수 있다. 하지만 노출되어도 괜찮은 내용이니 상관이 없다. 그리고 B가 메시지를 받으면 B는 A의 공개키로 열어본다. A의 공개키로 열었으니 이 메시지는 A의 비밀키로 암호화된 것이고, A의 비밀키는 A만 가지고 있으니 A가 보낸 메시지가 확실한 것이다. 이 방식은 전자 문서에서 서명으로 사용된다.
공개키로 암호화 하면 개인키로 복호화할 수 있다. (암호화)
개인키로 암호화 하면 공개키로 복호화할 수 있다. (전자 서명)
그런데 암호화 방식만 사용하면 해커가 중간에 탈취한 뒤 다른 내용으로 문서를 B의 공개키로 암호화해 보낼 수 있다. 그래서 A는 문서를 B의 공개키로 암호화 한 뒤 A의 개인키로 다시 암호화해서 보낸다. 그러면 B는 보낸 사람도 알 수 있고 문서도 안전하다.
B는 문서를 받으면 A의 공개키로 열어볼 것이다. 이때 문서가 열리면 A가 보냈다는 인증이 된 것이다. 열리지 않으면 인증 되지 않은 것이니 더 이상 문서를 볼 필요가 없다. 문서가 열릴 경우 B의 개인키로 문서의 내용을 확인한다.
이렇게 암호화와 전자 서명이 가능한 것이 RSA이다.