코딩 이래요래
위클리 페이퍼 - 14주차 본문
Q. Spring 기반 웹 애플리케이션에서 발생할 수 있는 4가지 주요 보안 공격 (CSRF, XSS, 세션 고정, JWT 탈취)에 대해 설명하고, 각각에 대한 Spring Security 또는 일반적인 대응 전략을 설명하세요.
CSRF (Cross-Site Request Forgery, 사이트 간 요청 위조)
- 사용자가 의도하지 않은 요청을 서버로 보내게 하는 공격
- 공격자는 피해자의 인증 정보(세션, 쿠키) 를 악용해 특정 행위를 실행시킴
- 예) 사용자가 로그인한 상태에서 악성 페이지 방문 → 자동으로 송금 요청 전송
Spring Security 대응 방법
1. CSRF 토큰 사용 (기본 활성화)
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
2. POST, PUT, DELETE 요청 시 토큰 검증
3. SameSite 쿠키 설정으로 CSRF 위험 최소화
SameSite?
- 쿠키가 어떤 도메인에서만 사용될 지 설정하는 옵션
3가지 옵션
- Strict: 반드시 같은 도메인에서만 사용 가능 (하위 도메인 포함)
- Lax: 같은 도메인에서만 사용 가능하지만, 유저가 링크를 클릭해서 접속하거나 하는 경우에는 다른 도메인에서도 사용 가능 (기본 값)
- None: 다른 도메인에서도 사용 가능. Secure 옵션과 함께 사용해야 함.
XSS (Cross-Site Scripting, 크로스 사이트 스크립팅)
- 웹 페이지에 악성 JavaScript를 삽입해 클라이언트에서 실행시키는 공격
- 주로 게시판, 댓글 입력창 등 사용자 입력값을 필터링하지 않을 때 발생
- 예) <script>alert('해킹');</script>
Spring 및 일반 대응 방법
1. 입력값 필터링 / 이스케이프 처리
String safeInput = HtmlUtils.htmlEscape(userInput);
2. HTTP 응답 헤더 설정
http.headers().xssProtection().and().contentSecurityPolicy("script-src 'self'");
세션 고정(Session Fixation)
- 공격자가 미리 발급된 세션 ID를 클라이언트에게 강제로 사용하게 한 뒤, 해당 세션을 탈취하는 공격
- 예) 로그인 전 발급받은 세션 ID를 로그인 후에도 계속 사용
1. 로그인 시 세션 ID 재발급
http.sessionManagement()
.sessionFixation().migrateSession(); // 기본값, 세션 새로 생성
2.로그아웃 시 세션 무효화
http.logout().invalidateHttpSession(true).deleteCookies("JSESSIONID");
JWT 탈취(JWT Hijacking)
- JWT(JSON Web Token)가 중간에서 탈취되면, 해당 토큰으로 누구나 인증된 사용자 행세 가능
- 주로 로컬 스토리지 / 세션 스토리지 보관 시 XSS에 의해 탈취될 수 있음
- HTTP Only + Secure 쿠키 사용
- 자바스크립트 접근 차단
- 짧은 만료 시간 + Refresh Token 사용
- 토큰 서명(Signature) 검증
- 토큰 무효화 전략 (Blacklist, Redis 등)
Q. JWT(JSON Web Token)의 구조와 각 구성 요소가 어떤 역할을 하는지 구체적으로 설명하세요.
JWT(JSON Web Token)의 구조
JWT는 .으로 구분된 3개의 문자열로 구성됨
xxxxx.yyyyy.zzzzz
Header.Payload.Signature
Header (헤더)
- 토큰의 타입(JWT)과 서명 알고리즘(HS256, RS256 등) 명시
- 예시:
{
"alg": "HS256",
"typ": "JWT"
}
Payload (페이로드)
- 인증 주체 정보와 토큰의 클레임(Claim) 저장
- 예시:
{
"sub": "user123",
"role": "ADMIN",
"iat": 1672502400,
"exp": 1672588800
}
- sub : 사용자 식별자
- iat : 발급 시각
- exp : 만료 시각
Signature (서명)
- Header + Payload 를 비밀키로 서명한 값
- 무결성 검증 역할
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secretKey
)
'위클리 페이퍼' 카테고리의 다른 글
위클리 페이퍼 - 13주차 (2) | 2025.08.04 |
---|---|
위클리 페이퍼 12주차 (2) | 2025.07.07 |
위클리 페이퍼 11주차 (3) | 2025.06.30 |
위클리 페이퍼 10주차 (5) | 2025.06.23 |
위클리 페이퍼 - 9주차 (2) | 2025.06.02 |