[HTTP] Accept-Charset은 왜 deprecated 되었나
1. Accept Charset 설정
HTTP 헤더의 Accept에 "application/json;charset=UTF-8"값을 넣기 위해 아래와 같은 코드를 작성했다. 여기서 Accept는 클라이언트가 처리할 수 있는 미디어 타입을 알리기 위해 사용한다. IntelliJ가 노란 줄로 표기해 주면서 deprecated 된 코드임을 알려주었다.
HttpHeaders headers = new HttpHeaders();
headers.setAccept(List.of(MediaType.APPLICATION_JSON_UTF8));
deprecated 된 사유에 대해 친절하게도 Spring이 주석을 달아두었다. 아래와 같은 내용이 적혀있었다.
Deprecated as of 5.2 in favor of APPLICATION_JSON_VALUE since major browsers like Chrome now comply with the specification and interpret correctly UTF-8 special characters without requiring a charset=UTF-8 parameter.
Spring Framework 5.2부터 depreacated 되었으며, 크롬 같은 주요 브라우저에서 UTF-8 인자가 없이도 UTF-8이 적용되고 있다는 말이었다. 여기서 나는 한 가지 의심이 들었다. 크롬 같은 주요 브라우저에서 지원하지만 크롬 외의 다른 브라우저에서는? 사파리나, 파이어폭스 같은 브라우저에서도 모두 지원되는 걸까? spring framework 레포지토리에 APPLICATION_JSON_UTF8과 관련된 이슈에 아래와 같은 댓글이 있었고 불안함은 커져가기만 했다.
2. Accpet-Charset은 deprecated 되었다?
Geeks for Geeks의 한 글에 의하면, 클라이언트가 처리할 수 있는 문자 인코딩을 제한하고 싶을 때 Accept-Charset을 이용한다고 한다. Accept에 "미디어타입;charset=UTF-8" 같은 방식으로 기입하는 경우는 Accept-Charset을 생략하는 경우 또는 미디어타입마다 문자 인코딩을 다르게 제한하고 싶은 경우인듯 하다.
Accept: text/html;charset=UTF-8
Accept의 charset 옵션에 대해서는 구글링을 하기 힘들어서 Accept-Charset에 대한 정보를 찾기 시작했다. 그러다 RFC에서 아래와 같은 글을 발견했다. (참고 링크)
Accept-Charset is deprecated because UTF-8 has become nearly ubiquitous and sending a detailed list of user-preferred charsets wastes bandwidth, increases latency, and makes passive fingerprinting far too easy (Section 17.13). Most general-purpose user agents do not send Accept-Charset unless specifically configured to do so.
UTF-8이 보편적으로 사용되기 시작하면서 아래 같은 문제들이 있어 Accpet-Charset은 더이상 사용하지 않는다.
- 대역폭(bandwidth) 낭비
- 대기 시간 증가
- fingerprinting 발생이 쉬워짐
fingerprinting 이란?
시간이 지나면서 고유한 특성들이 쌓이면 해당 정보들을 통해 사용자를 식별할 수 있는 기술이다. 여기서 고유한 특성이란 기본 전송 프로토콜, 스크립트 환경 등의 정보를 포함해 HTTP를 통해 통신하는 것까지 포함된다. 해당 정보들이 쌓이면 사용자의 동작을 추적할 수 있기 때문에 개인 정보 보호 문제로 간주된다.
추가로, UDN에서 모든 브라우저에서 더이상 지원하지 않는다고 정리된 자료도 찾았다.
참고
- https://github.com/spring-projects/spring-framework/issues/22788
- https://www.rfc-editor.org/rfc/rfc9110.html#name-accept-charset
- https://www.geeksforgeeks.org/http-headers-accept-charset/