Java/Spring

[Spring Boot - Java] URL-safe Base64 인코딩

logan.jeon 2025. 4. 1. 13:31
반응형
  • 서비스중 암호화한 문자 + Base64로 인코딩 된 데이터를 주고 받을 경우가 생겼었는데, 어떤 데이터는 정상적으로 주고 받아지는데 특정 암호화 데이터는 프론트엔드 서비스에서 간헐적으로 인식이 안되는 경우가 있었다.

  • 프론트 개발자분이 local 에서는 됐었다고 개발서버 환경이나 node, yarn 버전 문제 일 수 있나? 라는 의문을 주셨었다.

  • 프론트에서 url 로 암호화된 path parameter 를 백엔드로 GET API RequestParameter 로 보내야 하는 작업이었는데 프론트에서 암호화된 path parameter 를 정상적으로 읽지 못해(?) 발생하는 문제점이 있었다..문 간헐적으로 발생했다.. 물론 암호화된 문자는 백엔드에서 제공해 주고 있었는데.. 암호화된 문자를 url encoding 해서 보내는고 있었기에... 괜찮을 것으로 생각했다..!!

  • Docker container 로 빌드되서 서비스 중이라서..Node.js 이미지 버전만 바꾸면 될것 같았지만.. 다른방법을 찾아보기로함..

  • Java 에서 Base64.getUrlEncoder().withoutPadding().encodeToString(plainText) 을 사용하면 / -> -+ -> _ 대체하는 등 url encoding 을 따로 안할 수 있게 암호화된 문자를 사용 할 수 있다.
  • 물론 Base64.getUrlDecoder().decode(ciphterText) 를 사용해서 decode 할 수도 있다. (인코딩 알고리즘을 AES, RSA 등 같은것을 사용할 경우)
public static String encrypt(String plainText) {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec);
            byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            return Base64.getUrlEncoder().withoutPadding().encodeToString(encrypted);
        } catch (Exception e) {
            throw new RuntimeException("Encrypt Failed",e);
        }
    }
    public static String decrypt(String cipherText) {
        try {
            SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, keySpec);
            byte[] decrypted = Base64.getUrlDecoder().decode(cipherText);
            byte[] original = cipher.doFinal(decrypted);
            return new String(original, StandardCharsets.UTF_8);
        } catch (Exception e) {
            throw new RuntimeException("Decrypt Failed",e);
        }
    }
반응형