현대 웹 애플리케이션에서 사용자 데이터를 안전하게 보호하는 것은 필수적입니다.
특히 비밀번호나 개인정보와 같은 민감한 데이터를 클라이언트에서 서버로 전송할 때 보안은 더욱 중요해집니다.
이 글에서는 가장 널리 사용되는 두 가지 암호화 알고리즘인 AES와 RSA의 개념을 알아보고, 이 두 방식을 혼합하여 사용했을 때의 장점과 구체적인 구현 방법을 살펴보겠습니다.
암호화의 기본 개념
AES 암호화 (대칭키 암호화)
AES(Advanced Encryption Standard)는 대칭키 암호화 방식으로, 하나의 키를 사용하여 암호화와 복호화를 모두 수행합니다.
- 작동 방식: 같은 키로 데이터를 잠그고(암호화) 열 수 있음(복호화)
- 특징: 빠른 속도, 효율적인 연산, 대용량 데이터 처리에 적합
- 약점: 키를 안전하게 상대방에게 전달하는 문제 존재
평문(Hello) + AES 키(K) = 암호문(X72f#)
암호문(X72f#) + AES 키(K) = 평문(Hello)
RSA 암호화 (비대칭키 암호화)
RSA는 비대칭키 암호화 방식으로, 두 개의 서로 다른 키(공개 키와 개인 키)를 사용합니다.
- 작동 방식: 공개 키로 암호화하고 개인 키로 복호화
- 특징: 키 교환 문제 해결, 높은 보안성
- 약점: 연산 속도가 느림, 대용량 데이터 암호화에 비효율적
평문(Hello) + 공개 키(PubK) = 암호문(R9t@z)
암호문(R9t@z) + 개인 키(PrivK) = 평문(Hello)
단일 암호화 방식과 혼합 방식 비교
RSA만 사용하는 방식
1. 서버: RSA 공개 키와 개인 키 생성
2. 서버 → 클라이언트: RSA 공개 키 전송
3. 클라이언트: 사용자 비밀번호를 RSA 공개 키로 암호화
4. 클라이언트 → 서버: 암호화된 비밀번호 전송
5. 서버: RSA 개인 키로 비밀번호 복호화
장점: 구현이 상대적으로 간단합니다.
단점: RSA는 연산 비용이 높고, 암호화할 수 있는 데이터 크기에 제한이 있습니다.
AES와 RSA 혼합 방식
1. 서버: RSA 공개 키와 개인 키 생성
2. 클라이언트: AES 키 생성
3. 서버 → 클라이언트: RSA 공개 키 전송
4. 클라이언트:
- 비밀번호를 AES 키로 암호화
- AES 키 자체를 RSA 공개 키로 암호화
5. 클라이언트 → 서버: 암호화된 비밀번호 + 암호화된 AES 키 전송
6. 서버:
- RSA 개인 키로 AES 키 복호화
- 복호화된 AES 키로 비밀번호 복호화
왜 혼합 방식이 필요한가?
- 성능과 보안의 균형: RSA는 보안성이 높지만 느리고, AES는 빠르지만 키 교환에 취약합니다. 혼합 방식은 두 알고리즘의 장점만을 취합니다.
- 대용량 데이터 처리: RSA는 암호화할 수 있는 데이터 크기에 제한이 있어, 대용량 데이터 전송에는 적합하지 않습니다. AES는 이러한 제한 없이 효율적으로 데이터를 암호화할 수 있습니다.
- 전방 보안(Forward Secrecy): 세션마다 새로운 AES 키를 생성하면, 하나의 세션이 손상되더라도 다른 세션의 데이터는 안전하게 보호됩니다.
- 표준 프로토콜: SSL/TLS와 같은 현대 보안 프로토콜은 이러한 혼합 방식을 표준으로 채택하고 있습니다.
혼합 암호화 방식 실제 구현 예시: 온라인 뱅킹 로그인
가상 시나리오: '세이프뱅크' 로그인 과정
1. 사전 준비 단계
서버: RSA 키 쌍 생성
- 개인 키: RSA-PRIVATE-1a2b3c4d... (서버에만 안전하게 보관)
- 공개 키: RSA-PUBLIC-5e6f7g8h... (클라이언트에 제공할 키)
2. 로그인 페이지 접속
사용자 → 로그인 페이지 접속
서버 → 클라이언트: "RSA-PUBLIC-5e6f7g8h..." 전송
3. 사용자 정보 입력 및 처리
사용자: 아이디 "kim123"과 비밀번호 "MySecret2023!" 입력
브라우저(클라이언트) 작업:
1. 임시 AES 키 생성: "AES-KEY-9z8y7x6w..."
2. 비밀번호 AES 암호화: "MySecret2023!" → "AES-ENCRYPTED-abcdef123456..."
3. AES 키를 RSA 공개 키로 암호화: "AES-KEY-9z8y7x6w..." → "RSA-ENCRYPTED-qwerty789012..."
4. 서버로 데이터 전송
클라이언트 → 서버:
{
"username": "kim123",
"encryptedPassword": "AES-ENCRYPTED-abcdef123456...",
"encryptedAESKey": "RSA-ENCRYPTED-qwerty789012..."
}
5. 서버 측 처리
서버 작업:
1. RSA 개인 키로 AES 키 복호화:
"RSA-ENCRYPTED-qwerty789012..." → "AES-KEY-9z8y7x6w..."
2. 복구된 AES 키로 비밀번호 복호화:
"AES-ENCRYPTED-abcdef123456..." → "MySecret2023!"
3. 비밀번호 검증 및 로그인 처리
6. 데이터 흐름 다이어그램
[사용자] → 입력 → [브라우저] → 암호화 → [서버] → 복호화 → [데이터베이스]
kim123 ↓ ↑
MySecret2023! ↓ ↑
AES 암호화 비밀번호 ↑
RSA 암호화 AES 키 → → → →
사실, 현재는 대부분의 경우, 비밀번호와 같은 민감 정보를 복호화한 상태로 DB에 저장해두지 않습니다.
하지만 예시로 든 가상 시나리오에서는 혼합 방식의 원리를 이해시키기 위해 복호화 한 정보를 데이터베이스에 저장하는 시나리오로 작성했습니다.
비밀번호를 암호화 시켜 저장할 때 많이 사용되는 해싱에 관한 내용은 아래 포스팅을 참고해주세요.
2025.04.08 - [보안] - 비밀번호 등 보안상 민감한 정보를 저장할 때 자주 사용되는 '해싱'에 대해
비밀번호 등 보안상 민감한 정보를 저장할 때 자주 사용되는 '해싱'에 대해
비밀번호를 원문 그대로 데이터베이스에 저장하는 것은 절대 금물입니다데이터베이스가 해킹당하는 순간, 모든 사용자의 계정이 노출되며 이는 돌이킬 수 없는 피해로 이어집니다.본 글에서는
shin-e-dog.tistory.com
혼합 방식의 보안상 이점
1. 중간자 공격(Man-in-the-Middle) 방지
통신이 도청되더라도 공격자는 다음 두 가지를 모두 해독해야 합니다.
- RSA 개인 키 없이는 AES 키를 알아낼 수 없음
- AES 키 없이는 실제 비밀번호를 알아낼 수 없음
2. 성능 최적화
- 대용량 데이터는 빠른 AES로 암호화
- 작은 크기의 AES 키만 RSA로 암호화
- 결과적으로 보안성과 성능 모두 확보
3. 세션 격리 및 전방 보안
- 매 세션마다 새로운 AES 키를 생성
- 한 세션이 뚫려도 다른 세션의 데이터는 안전
- RSA 개인 키가 훗날 유출되더라도 과거 통신 내용 보호 가능
4. 확장성
- 비밀번호뿐만 아니라 다양한 민감 정보를 같은 방식으로 보호 가능
- 필요에 따라 더 강력한 암호화 알고리즘으로 업그레이드 용이
서버 측 RSA 키 관리
대부분의 웹 서비스에서는 RSA 키 쌍을 다음과 같이 관리합니다.
- 장기 사용: 키 생성은 계산 비용이 높기 때문에 한 번 생성한 RSA 키 쌍을 비교적 장기간 사용합니다.
- 주기적 갱신: 보안 정책에 따라 주기적으로(예: 6개월~1년) 키 쌍을 갱신합니다.
- 안전한 보관: RSA 개인 키는 HSM(Hardware Security Module)과 같은 특수 하드웨어나 안전한 저장소에 보관합니다.
결론
AES와 RSA 혼합 암호화 방식은 현대 웹 보안의 기본이 되는 중요한 개념입니다.
이 두 알고리즘의 장점을 결합함으로써 안전하면서도 효율적인 데이터 전송이 가능해졌습니다.
이러한 혼합 암호화 방식은 비단 로그인 시스템뿐만 아니라 전자상거래, 메시징 앱, 그리고 중요한 데이터를 다루는 여러 웹 애플리케이션에서 다양하게 사용되고 있습니다.
'보안' 카테고리의 다른 글
인증과 인가의 차이(feat: 가상 시나리오 예시) (0) | 2025.04.09 |
---|---|
비밀번호 등 보안상 민감한 정보를 저장할 때 자주 사용되는 '해싱'에 대해 (0) | 2025.04.08 |
SSL/TLS 인증서와 프록시 환경의 기업 네트워크 보안의 이해 (0) | 2025.03.24 |
HMAC Signature(ft. 가상 시나리오, 예시 코드) (0) | 2023.10.20 |