반응형
서비스중 암호화한 문자 + 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);
}
}
반응형
'Java > Spring' 카테고리의 다른 글
[Spring Boot - Java] @Component를 사용중인 클래스에서 @Value 사용하기 (0) | 2023.11.30 |
---|---|
[Spring Boot - Mybatis] Maven jar 패키지 시 mybatis xml 파일도 같이 패키지에 추가 (0) | 2023.11.10 |
[Spring Boot - Java] Scheduler 사용해보기 (2) | 2023.11.10 |