기술과 산업/언어 및 프레임워크

Java JSON 처리 실전 시리즈 9화 – 따옴표 없는 JSON 처리하기: 비표준 포맷 대응 전략과 보안 고려사항

B컷개발자 2025. 5. 19. 11:01
728x90

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