-
Java JSON 처리 실전 시리즈 9화 – 따옴표 없는 JSON 처리하기: 비표준 포맷 대응 전략과 보안 고려사항기술과 산업/언어 및 프레임워크 2025. 5. 19. 11:01728x90
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 응답 포맷 다변화, 설정 마이그레이션, 데이터 백업 포맷 등에서 유용한 기법입니다.
728x90'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글