base64를 인코딩하여 사용하던 중 url safe가 되지않아 디코딩한 값이 깨지는 현상이 발생했다.
base64란 컴퓨터가 8비트의 이진데이터를 ASCII코드로 바꾸는 인코딩 방식입니다.
다음은 base 64코드표입니다.
base64는 이 64개의 글자를 이용해서 인코딩된 base64문자열을 생성합니다.
또한 문장이 끝나면 '=' 로 데이터가 끝났다는 것을 표시해, 원복할때 틀리지 않도록 방지합니다.
인코딩 순서는 아래와 같습니다.
public static String encodeToString(Object obj) {
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(obj);
byte[] targetBytes = json.getBytes();
return Base64.getEncoder().encodeToString(targetBytes);
}
위 코드는 오브젝트를 받아 Gson을 사용하여 json으로 파싱한 뒤, json을 base64로 인코딩한 예제입니다.
디코딩은 다음과 같습니다.
public static <T> T base64Decoding(String org, Class<T> type) {
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodingData = decoder.decode(org);
String strDecodingData;
try {
strDecodingData = new String(decodingData, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("decoding fail");
}
Gson gson = new Gson();
return gson.fromJson(strOrgData, type);
}
base64형태의 문자열을 웹으로 전송하는 경우 +(62),/(63) 글자가 포함되어있어 정상적으로 전송되지 않습니다.
이
base64 url safe은 이 문제를 해결하기위해 등장했습니다.
위의 표 처럼 -(62), _(63)으로 변경된 것을 확인 할 수있습니다.