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="주소"> 같은 경로 조작 차단
- <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 넣는것을 차단하여 클릭재킹 방어
'Backend > SpringBoot' 카테고리의 다른 글
| [Entity] GeneratedValue 대신 TSID 사용하기 (0) | 2026.02.10 |
|---|---|
| OAuth 연동 (0) | 2026.02.06 |
| Cursor 기반 Paging 추가 정리(QueryDsl 기준) (0) | 2026.02.03 |
| 임시 비번 발급 후 비교할때 주의점(PasswordEncoder) (0) | 2026.02.02 |
| Hexagonal Architecture 일부적용 및 느낀점 (0) | 2026.01.30 |