문제 상황

API 응답에서 특수문자가 Unicode escape 형태로 내려오는 현상이 있었다. 
예를 들어, > 기호가 \u003E로 바뀌는 경우가 해당된다. 
디버깅 시에는 >로 보이지만, 실제 응답에서는 인코딩된 문자처럼 보이는 이유와 해결방법을 정리해보았습니다. 

 

예시

public class Product {
@JsonProperty("description")
private String description = "1 > 0";
}
  • 디버깅 출력 : 1 > 0 (그대로)
  • JSON 응답 : 1 \u003E 0 

 

원인 분석

  • 디버깅 : 단순 문자열 표시라 > 그대로 보임
  • JSON 직렬화 : Jackson 등 직렬화 도구에서 보안 목적으로 이스케이프 처리
  • > 에서 \u003E 로 보임 : <, >, & 등은 XSS 방지 대상 문자임
  • Serializable : 직렬화 관련은 있지만 JSON 인코딩과는 무관

 

해결방법

방법 1: Unicode escape 끄기 (Jackson)

ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonGenerator.Feature.ESCAPE_NON_ASCII, false);

 

방법 2: HTML escape 커스터마이징 (보안 유지하면서 처리)

mapper.getFactory().setCharacterEscapes(new HtmlCharacterEscapes());