Backend/SpringBoot

[Spring Security] XSS 방어

Dean83 2026. 2. 11. 14:32

XSS 방어는 사용자가 신뢰하는 웹사이트 내에서 악의적인 스크립트가 실행되지 않도록 막는 보안 전략이다. (JS 포함 HTML 등도 해당) 

 

서버에서 설정 할 수 있는 항목은 크게 두가지로 생각해 볼 수 있다.  (보통은 서버에서 html을 내려줄 일이 없으므로)

  • CSP (Content Security Policy) 설정
    • 이 출처에서 온 리소스만 사용할 수 있도록 하는 설정
  • 쿠키 이용시, HttpOnly, Secure 설정

 

CSP 설정 예

  • httpSecurity의 header 에 추가하는 설정
  • 스크립트, 이미지 등의 출처를 명시해 두어, 해당 출처로 부터 온 데이터들만 사용 할 수 있도록 한다.
  • 공백이 매우 중요하다. 하나의 설정이 끝나는 지점에 ; 를 적어두고 공백을 하나 띄워야 한다.
  • 연속된 설정의 경우 다음 항목에 공백을 두어야 하고, 값 배정에도 공백을 두어야 한다.
    • 예 : connect-src 공백 'self' 공백 https: 공백 wss:; 공백
  • 여기서 self 의 의미는 프론트엔드가 서빙되고 있는 주소를 의미한다.
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    ....
    
    http.sessionManagement(management ->
                    management.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .headers(header -> header
                    .contentSecurityPolicy(csp -> csp
                            .policyDirectives(
                                    "default-src 'self'; " +
                                            "script-src 'self'; " +
                                            "script-src-attr 'none'; " +
                                            "script-src-elem 'self'; " +
                                            "object-src 'none'; " +
                                            "base-uri 'none'; " +
                                            "img-src 'self' data: https://*.ap-northeast-2.amazonaws.com; " +
                                            "form-action 'self' https://백앤드주소; "  +
                                            "connect-src 'self' https:백앤드주소 and 허용하는_서버_주소 나열 wss:; "+
                                            "frame-ancestors 'none'"
                            ))
  • default-src ‘self’;
    • 기본정책으로, 따로 명시되지 않은 리소스는 같은 origin만 허용한다.
  • script-src ‘self’;
    • 같은 서버의 javascript만 실행
  • script-src-attr ‘none’;
    • 스크립트 내 인라인 이벤트 스크립트 차단 (예 : 버튼 클릭 이벤트)
  • script-src-elem ‘self’;
    • <script src="">로 불러오는 JS 제한.
  • object-src ‘none’;
    • Flash, plugin, object 태그 차단
    • 거의 필수
  • base-uri ‘none’;
    • <base href="주소"> 같은 경로 조작 차단
  • img-src ‘self’ data: S3도메인
    • 이미지 파일은 나와 같은 도메인 혹은 S3에 있는 도메인만 허용
  • form-action ‘self’;
    • 다른 사이트로 Form을 제출 할 수 없도록 제한
    • https://백앤드주소 를 추가하여 OAuth가 리다이렉트 하는 경로를 추가할 수 있다 (폼로그인 OAuth는 거의 없음)
  • connect-src ‘self’ https: wss:;
    • fetch, axios, WebSocket, SSE 허용 출처 설정
    • https:, wss: 는 모든 연결을 허용
    • 만일 특정 주소로 제한하고 싶다면, https://백앤드주소 https://외부api서버주소 등 연장하여 설정해야 한다.
      • wss://백앤드주소   이것도 마찬가지.
  • frame-ancestors ‘none’;
    • 다른 사이트에서 내 사이트에 iframe 넣는것을 차단하여 클릭재킹 방어