본문 바로가기
개발/Java

[Java] XSS(Cross-Site Scripting) 공격에 대비하자!!

by 쓸있쏜 2024. 12. 3.

XSS 공격? 그게 뭐예요?

자바(Java)로 개발을 하다 보면 "XSS"라는 말을 들어본 적 있죠? 마치 친구가 "야, 저기 위험하니까 조심해!"라고 말해주는 것처럼, XSS는 우리가 코드를 안전하게 짜야 할 이유를 알려주는 경고 같은 거예요. 하지만 걱정 마세요. 오늘은 제가 아주 쉽게, 그리고 재밌게 XSS 공격에 대비하는 방법을 알려드릴게요.


XSS가 뭔지부터 알아봐요

XSS(Cross-Site Scripting)는 말 그대로 "사이트 간 스크립트"예요. 뭐냐면, 누군가가 우리 사이트에 악성 스크립트를 몰래 넣어서 사용자에게 피해를 입히는 거죠. 예를 들어 볼까요?

  1. 악의적인 사용자가 댓글란에 이런 코드를 넣어요: <script>alert('해킹당했어요!');</script>.
  2. 사용자가 그 댓글을 보게 되면, 갑자기 브라우저에 팝업이 뜨죠. "해킹당했어요!"라면서요.

어때요? 진짜 짜증 나죠? 우리 소중한 사용자들이 이런 일을 겪지 않게 하려면, 자바로 안전한 함수를 만들어야 해요.

XSS(Cross-Site Scripting) 공격에 대비하자


자바로 안전한 XSS 방어 코드 만들기

자, 이제 본격적으로 들어가 봐요. 먼저 우리가 알아야 할 건, XSS 방어의 핵심은 입력값을 제대로 검증하고 필터링하는 것이에요. 사용자가 입력한 값을 그대로 출력하면 절대 안 돼요! 아래처럼 만들어 볼게요.

1. HTML 특수문자를 변환하는 함수 만들기

HTML에서는 <, >, &, " 같은 특수문자가 문제가 돼요. 이걸 안전하게 변환해 주는 함수를 만들어 볼까요?

public class XSSFilter {
    public static String escapeHTML(String input) {
        if (input == null) {
            return null;
        }
        return input.replaceAll("&", "&amp;")
                    .replaceAll("<", "&lt;")
                    .replaceAll(">", "&gt;")
                    .replaceAll("\"", "&quot;")
                    .replaceAll("'", "&#39;");
    }
}

이 함수는 사용자가 입력한 문자열에서 문제가 될 만한 문자를 HTML 엔티티로 변환해 줘요.
예를 들어, 사용자가 <script>를 입력하면, 이 함수는 &lt;script&gt;로 바꿔줘요. 그러면 브라우저가 이걸 단순한 텍스트로만 인식하죠.


실제 사용 예시

이제 함수를 사용해 볼까요?
블로그 댓글 시스템을 만든다고 가정해 봐요.

public class BlogCommentHandler {
    public static void main(String[] args) {
        String userInput = "<script>alert('해킹당했어요!');</script>";
        String safeInput = XSSFilter.escapeHTML(userInput);

        System.out.println("안전한 출력: " + safeInput);
    }
}

출력 결과는 어떻게 될까요?

안전한 출력: &lt;script&gt;alert('해킹당했어요!');&lt;/script&gt;

보이죠? 이제 사용자의 브라우저에서는 아무 일도 일어나지 않아요.
이렇게 하면 악성 스크립트가 우리 사용자들에게 피해를 입히는 걸 막을 수 있어요.


추가 꿀팁!

  • 라이브러리 활용하기: 직접 함수 짜는 것도 좋지만, 이미 잘 만들어진 라이브러리를 사용하는 것도 좋아요. Apache의 StringEscapeUtils나 OWASP의 ESAPI 라이브러리를 활용하면 더 간단하고 강력하게 XSS를 방어할 수 있어요.
  • 출력 위치에 따라 필터링하기: HTML, JavaScript, URL, CSS 등 출력 위치마다 다른 방식으로 처리해야 할 때가 있어요. 예를 들어 JavaScript 안에 문자열을 출력한다면, 작은따옴표와 역슬래시도 추가로 변환해야겠죠.

마지막으로

자바 개발자 20년 차로서 여러분께 드리고 싶은 말은요, 보안은 선택이 아니라 필수라는 거예요. 그리고 XSS 방어는 그 시작일 뿐이에요. 이렇게 조금씩 배우고 적용하다 보면, 여러분의 코드는 점점 더 단단해질 거예요.

끝으로, 한마디 덧붙이고 싶어요.
"코드는 사랑입니다. 사랑으로 코드를 쓰세요. 그러면 여러분의 사용자는 행복할 거예요."

 

댓글