JAVA

Eescape된 HTML 태그를 JAVA에서 Unescape

Ambitions 2021. 3. 3. 12:15

개발을 하던 도중 html태그와 text내용이 섞여있는 데이터를 DB저장 한 뒤 뿌려줄 일이 있었는데, 

프론트단에서 보낸 html태그 들이 서비스단을 통과하면서 html 엔티티로 변경되어 저장되는 문제가 발생했다.

본래 서비스단에서 html 엔티티로 변경되는 이유는 보안적인 이슈(XSS) 때문에 변경되게 설정이 잡혀있는 것으로 알고 있었는데, 일단 기능 구현하려는 페이지는 내부적으로 사용하는 페이지였기 때문에 그냥 html 엔티티로 escape 되는 부분을 바꿔줘야 했다.

 

일단 고민해본 방법으로는 html 엔티티로 바뀌어져 들어오는 부분을 정규식을 이용해서 replace하는 방법이 있었는데, 정규식의 경우 눈에 잘 안들어 오기도하고 모든 html 엔티티에 대한 정규식을 작성하는 것에도 어려움이 있어, 찾아본 결과 org.apache.commons.text 패키지안에 String 관련 처리 클래스들이 있길래 사용해 보기로 했다.

 

그 중에서 StringEscapeUtils.unescapeHtml를 이용해서 unescape를 해주었고, 이 내용을 코드로 보면 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
import org.apache.commons.lang.StringEscapeUtils;
 
// 클래스 생략
 
public String unescapeHelper(String data) {
    
    //input 값(escape된 값) 예시 : <br>123
    String result = StringEscapeUtils.unescapeHtml(data);
    
    //output 값(unescape된 값) : <br><123>
    return result;
}
cs

unescapeHtml 파라미터로 대상 String 값만 던져주면 escape된 HTML 엔티티 값을 unescape해주는 코드이다.

반대로 StringEscapeUtils에는 escape해주는 메소드와 xml, csv등 데이터를 escape, unescape를 해주는 메소드도 제공하고 있다.

 

이번 문제를 해결하면서 html 엔티티, spring의 escape설정 (우리쪽의 경우 jsoup을 이용하는 것 같다.)을 확인해 볼 수있는 좋은 기회였던 것 같다.