Java JSON 처리 실전 시리즈 9화 – 따옴표 없는 JSON 처리하기: 비표준 포맷 대응 전략과 보안 고려사항
Jackson에서 따옴표 없는 필드, 단일 따옴표 등 비표준 JSON 형식을 처리하는 방법을 다룹니다. JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES 활용법과 실무 적용 시 주의사항을 정리합니다.
1. 왜 따옴표 없는 JSON이 문제가 되는가?
표준 JSON에서는 모든 키와 문자열 값에 반드시 **쌍따옴표(")**가 있어야 합니다.
RFC 8259 – JSON 표준 예시:
{
"name": "홍길동",
"age": 30
}
그러나 실무에서는 다음과 같은 비표준 JSON을 종종 마주합니다:
{
name: '홍길동',
age: 30
}
- 키에 쌍따옴표 없음
- 문자열 값에 단일 따옴표 사용
이런 JSON은 Jackson의 기본 설정으로는 파싱되지 않고 JsonParseException이 발생합니다.
2. Jackson의 유연한 파싱 기능
Jackson은 이러한 비표준 JSON을 허용할 수 있는 설정을 제공합니다. 하지만 이 기능은 기본적으로 비활성화되어 있으며, 명시적으로 허용해야 합니다.
3. 비표준 JSON 허용 설정
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
설명
설정 기능
ALLOW_UNQUOTED_FIELD_NAMES | JSON 키에 따옴표가 없는 경우 허용 (name: "홍길동") |
ALLOW_SINGLE_QUOTES | 문자열 값에 단일 따옴표 사용 허용 ('홍길동') |
예제
String json = "{ name: '홍길동', age: 30 }";
User user = mapper.readValue(json, User.class);
결과
user.getName(); // "홍길동"
user.getAge(); // 30
4. 실무 적용 시 주의사항
Jackson의 유연성은 강력하지만, 보안과 유지보수 측면에서 다음과 같은 주의가 필요합니다.
1) 신뢰되지 않은 외부 JSON에는 사용 주의
- 따옴표가 없거나, 문자열로 위장한 코드가 포함되면 XSS, Injection 등 보안 이슈 발생 가능
- 특히 웹 프론트엔드에서 데이터를 직접 전달받는 경우는 반드시 정규화된 JSON만 처리해야 함
2) 내부 테스트/마이그레이션 용도로 제한
- 로그 파서, 테스트용 JSON 입력, 임시 스크립트 변환 등 통제 가능한 환경에서만 제한적으로 사용 권장
3) Spring Boot에서 사용 시 별도 ObjectMapper 분리 필요
@Bean
public ObjectMapper permissiveObjectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
return mapper;
}
→ 전역 등록하지 말고, 특정 상황에서만 수동으로 사용할 것
→ 기본 Web MVC의 ObjectMapper에는 적용하지 않는 것이 안전합니다.
5. 비표준 JSON 자동 정규화 전략 (선택적)
실무에서는 다음과 같은 사전 필터링 로직으로 JSON 문자열을 정규화할 수도 있습니다:
String input = "{ name: '홍길동' }";
String normalized = input
.replaceAll("(?<=\\{|,)\\s*(\\w+)\\s*:", "\"$1\":")
.replaceAll("'", "\"");
User user = mapper.readValue(normalized, User.class);
이 방법은 임시 대응용으로만 사용하세요. JSON 파서에 의존하지 않고 문자열을 조작하는 방식은 예외를 유발할 수 있습니다.
결론: 유연성과 보안의 균형
선택지 추천 상황
비표준 JSON 허용 (Feature.ALLOW_*) | 내부 시스템 간 통신, 테스트 환경 |
정규 JSON만 허용 (기본 설정 유지) | 외부 API, 브라우저 요청, 공공 서비스 |
전처리 정규화 로직 | 마이그레이션, 레거시 로그 파싱 등 일시적 상황 |
Jackson의 유연한 파싱 기능은 편리하지만 절대 만능은 아닙니다.
보안이 중요하거나 외부 입력을 받을 경우에는 표준 JSON만을 처리하는 것이 원칙입니다.
다음 회차 예고
10화에서는 Jackson의 ObjectMapper를 활용해 JSON ↔ YAML, XML 등 다른 포맷으로 변환하는 방법과 실무에서의 적용 전략을 소개합니다. API 응답 포맷 다변화, 설정 마이그레이션, 데이터 백업 포맷 등에서 유용한 기법입니다.