- 클라이언트와 서버간에 RSA 암호화/복호화를 이용한 통신 과정2021년 09월 18일
- 루루개발자
- 작성자
- 2021.09.18.:55
반응형안녕하세요.
오늘은 클라이언트와 서버간에 RSA 암호화/복호화를 이용하여 통신하는 과정을 리뷰해볼려고 합니다.
사실 이 과정은 https 를 적용하면 http 통신 과정에서 자동으로 이루어지는 내용이긴 하지만 직접 구현한다면 이런 과정으로 구현 할 수도 있다 라는 것을 보여드리고자 리뷰를 하게 되었습니다.
그럼 시작하도록 하겠습니다. :)
<클라이언트>
1. 랜덤문자열과 타임스탬프가 섞인 32자인 문자를 생성합니다. 이것을 '토큰'이라 명명하겠습니다.
2. 서버에 보낼 데이터들을 aes-256-cbc 알고리즘으로 암호화 합니다. (이 때, 방금 생성한 토큰을 암호화 키로 사용합니다.)
3. 암호화 키로 사용한 토큰을 서버의 비밀키에 대응하는 공개키로 암호화 합니다.
4. 토큰으로 암호화한 데이터와 공개키로 암호화한 토큰을 담아 서버에 전송합니다.
<서버>
1. 클라이언트로 부터 온 데이터 중에 공개키로 암호화된 토큰을 서버에 저장된 비밀키로 복호화 합니다.
2. 클라이언트로 부터 온 데이터들을 복호화 합니다. (이 때, 방금 복호화된 토큰을 복호화 키로 활용합니다.)
3. 필요한 로직을 처리 후, 클라이언트에게 응답해야 할 값들을 aes-256-cbc 알고리즘으로 암호화 합니다. (이 때, 방금 복호화된 토큰을 암호화 키로 사용합니다.)
4. 클라이언트에게 암호화된 응답 값을 반환합니다.
<클라이언트>
1. 서버로부터 응답받은 암호화된 데이터들을 서버에 보낼 때 암호화 키로 사용한 토큰을 이용해 복호화 합니다.
2. 토큰을 폐기합니다. (null 할당 등)
3 복호화된 응답 값을 이용해 이후 로직을 처리합니다.
클라이언트에서 서버와 매번 통신할 때마다 생성되는 토큰은 공개키로 암호화 되어 서버로 전송되기 때문에 중간에 데이터를 탈취 당하더라도, 탈취자는 암호화된 토큰을 복호화 할 수 없습니다. 공개키로 암호화된 것은 비밀키로만 복호화가 가능한데, 비밀키는 서버에 비밀리에 관리되고 있기 때문입니다.
따라서 탈취자는 토큰을 포함한 데이터를 중간에 탈취 하더라도 토큰이 무엇인지 알 수 없고, 토큰을 알 수 없기 때문에 토큰으로 암호화된 데이터들의 복호화가 불가능하여 어떤 내용인지 전혀 알 수 없습니다. 해당 토큰은 비밀키가 보관되어 있는 서버에서만 복호화 하여 알 수 있고 복호화가 가능한 서버에서만 해당 토큰으로 데이터들을 복호화하여 데이터의 원문을 알아낼 수 있는 것입니다.
또한, 이 토큰을 암호화 키로 사용해 암호화한 데이터를 클라이언트에게 응답 값으로 반환했을 때, 이 응답 값 또한 탈취 당하더라도 탈취자는 응답 값의 내용을 알 수 없습니다. 해당 토큰은 클라이언트에서 생성되었던 토큰이기 때문에 탈취자는 토큰이 무엇인지 알아낼 수 없습니다. 토큰을 모르니 암호화된 응답 값을 복호화 할 수 없으므로 내용을 알 수 없게 되는 것입니다. 오직 토큰이 무엇인지 알고 있는 클라이언트에서만 응답 값을 복호화하여 어떤 내용인지 알 수 있는 것입니다.
눈치 채신 분들도 계시겠지만, 암호화/복호화시 RSA (비대칭키) 방식만 사용한 것이 아니라 대칭키 방식도 사용된 것을 알 수 있습니다. 비대칭키 방식과 대칭키 방식을 같이 사용하는 이유는 바로 속도 차이에 있습니다. 비대칭키 방식은 속도가 느린 편이고 대칭키 방식은 속도가 빠른 편입니다. 따라서 클라이언트에서 속도가 빠른 대칭키 방식으로 데이터들을 암호화하고 대칭키 방식에 사용된 키만 비대칭키 방식으로 암호화해서 서버에 보내면, 서버 쪽에서도 대칭키 방식에 사용된 키만 비대칭키 방식으로 복호화 하여, 데이터들은 대칭키 방식으로 복호화 할 수 있기 때문에 속도 측면에서 이 방법이 훨씬 효율적이기 때문입니다.
이렇게 오늘은 RSA 방식과 대칭키 방식을 이용한 암복호화 통신 과정을 리뷰해 보았습니다.
여유가 된다면 실제로 구현한 과정을 해당 포스트글에 추가 기재하도록 하겠습니다.
감사합니다 :)
반응형'IT 기타' 카테고리의 다른 글
OAuth 2.0 에 대하여 (0) 2021.11.27 OSI 7계층 (0) 2021.10.27 프로세스(Process)와 스레드(Thread) (1) 2021.10.25 런타임(Runtime) 이란? (2) 2021.10.25 https 동작 원리에 대하여 (0) 2021.01.02 다음글이전글이전 글이 없습니다.댓글