본문 바로가기

TIPS

RSA 핵심 원리와 웹에서의 안전한 쓰임새 part.1 (1/3)

728x90
반응형
SMALL

 

 

안녕하세요 오랜만에 뵙겠습니다.

그동안 까먹은건 아니고 명절과 각종 일들이 많아지면서 포스팅을 약 2주간 쉬었는데

이번주부더 다시 꾸준하게 포스팅 시작해보려고 합니다.

 

이번에 포스팅할 주제는 제가 주로 다루고있는 '보안'에 관련된 주제 입니다.

보안 회사를 다니면서 타 주제보다 보안에 더 잘 앎에도 불구하고 자주 포스팅 안한거 같아

이렇게 포스팅을 해보려 합니다.

 

고로 보안 회사 관점에서 브라우저/웹 서비스에서 RSA를 안전하게 쓰는 법을 3편으로 정리해보겠습니다.

포스팅 순서는 쉬운 도입 → 실전 코드 → 심화·운영 보안 순서로 구성하였고

가능하면 Web Crypto API(표준) 를 우선 사용하겠습니다.

참고로 “rsa.js” 같은 순수 JS 구현은 학습용으로만 참고하고, 실서비스에서는 표준 API/검증된 라이브러리를 권장드립니다.

 

 

서론이 특이하게 길었는데 그만하고 시작하겠습니다.

 

왜 RSA를 쓰나요?

 

 

  • 키 분리: 공개키로 암호화/검증, 개인키로 복호화/서명입니다. 키를 나누면 배포/권한 분리가 쉬워집니다.
  • 주요 용도: 작은 데이터 암호화(주로 세션키 암호화), 전자서명, 키 교환입니다. 실제 대용량 데이터는 대칭키(AES) 로 처리하는 하이브리드 방식이 표준입니다.

 

반드시 알아둘 보안 포인트

 

  • 패딩: 암호화는 RSA-OAEP, 서명은 RSASSA-PSS 권장입니다. (PKCS#1 v1.5는 호환용에 한정)
  • 키 길이: 실무 권장 최소 2048-bit, 가능하면 3072-bit 이상입니다.
  • 난수: 브라우저/Node의 CSPRNG 사용이 기본입니다.
  • 직접 구현 금지: rsa.js 같은 수제 구현은 학습용으로만 보시고, 실무는 Web Crypto API, 서버는 BouncyCastle/openssl 등 검증 스택을 쓰겠습니다.

 

 

 

브라우저에서 공개키로 암호화 (RSA-OAEP)
 

 

 

// 변경점: 표준 Web Crypto API 사용, RSA-OAEP로 공개키 가져오기/암호화입니다.
async function importPublicKey(pem) {
  const b64 = pem.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, "").replace(/\s+/g, "");
  const der = Uint8Array.from(atob(b64), c => c.charCodeAt(0));
  return crypto.subtle.importKey(
    "spki", der.buffer,
    { name: "RSA-OAEP", hash: "SHA-256" },
    false, ["encrypt"]
  );
}

async function encryptWithRsaOaep(publicPem, dataUtf8) {
  const key = await importPublicKey(publicPem);
  const enc = new TextEncoder().encode(dataUtf8);
  const ct = await crypto.subtle.encrypt({ name: "RSA-OAEP" }, key, enc);
  return btoa(String.fromCharCode(...new Uint8Array(ct))); // 전송용 Base64
}
 

 

키 포맷 변경점: 브라우저는 SPKI(공개키)/PKCS#8(개인키) DER 바이너리를 importKey로 받습니다. PEM→DER 변환만 해주면 호환됩니다.

 

 

왜 “하이브리드”가 기본일까요?

 

  • RSA는 블록 제약과 성능 한계가 있어 소량 데이터에 적합합니다.
  • 안전한 패턴은 AES-GCM(본문) + RSA-OAEP(세션키) 입니다. 이것은 2편에서 코드를 이어가겠습니다.

 

 

고로 이번편을 한줄로 요약하자면

RSA는 “작은 것만”, 패딩은 OAEP/PSS, 실전은 하이브리드가 정답입니다.

 

이상 포스팅을 마치고 2편에서 뵙겠습니다

 

 

728x90
반응형
LIST