티스토리 뷰
반응형
세션고정 공격
- 로그인 인증 후에도 동일한 세션ID(식별자)를 사용할 경우, 공격자가 세션ID(ex. JSESSIONID)를 탈취하면 사용자명과 패스워드 없이 인증된 사용자의 세션을 사용할 수 있음
- Spring Security의 세션고정 보호기능은 사용자가 인증된 후 명시적으로 새로운 세션을 생성하고, 기존 세션을 무효화할 수 있음
session-fixation-protection 속성
none() | 세션 고정보호를 사용하지 않음 |
migrateSession() | 사용자 인증 후 신규 세션 생성 시 기존 세션의 모든 속성이 새로운 세션으로 이동 |
newSession() | 사용자 인증 후 신규 세션 생성 시 기존 세션의 몯ㄴ 속성은 새로운 세션으로 이동하지 않음 |
동시세션 관리
- 사용자가 동시에 고정된 수 (일반적으로는 1개) 이상의 활성화 된 세션을 가질 수 없도록 함
- SessionRegistry를 사용하여 활성화 된 HTTP 세션과 인증된 사용자의 목록을 유지 및 관리
- 사용자 세션이 강제로 만료될 경우, 사용자를 로그인 페이지로 리다이렉트
- 두 번째 사용자의 로그인이 불가능하도록 기능 제공(maxSessionPreventLogin()). 단, 이경우 로그아웃없이 브라우저 종료를 할 경우, 세션이 종료될 때까지 애플리케이션에 로그인이 불가능함
#SecurityConfig.java
...
http.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login?expired")
.maxSessionPreventsLogin(true);
...
- 활성화 된 세션을 확인하고 강제 세션 로그아웃 기능 제공
...
#활성세션 확인
@GetMapping("/user/sessions/")
public String sessions(Authentication authentication, ModelMap model) {
List<SessionInformation> sessions = sessionRegistry.getAllSessions(authentication.getPricipal(), false);
model.put("sessions", sessions);
return "user/sessions";
}
#세션 로그아웃
@DeleteMapping(value="/user/sessions/{sessionId}")
public String removeSession(@PathVariable String sessionId) {
SessionInformation sessionInformation = sessionRegistry.getSessionInformation(sessionId);
if( sessionInformation != null ){
sessionInformation.expireNow();
}
return "redirect:/user/sessions/";
}
CSRF
- 일반적으로 Spring Security는 <form:form> 태그에 대해 CSRF Form 필드를 자동으로 삽입함
#SecurityConfig.java
@Override
public void configure(HttpSecuity http) throws Exception {
...
http.csrf()
...
}
- <form:form>을 사용할 수 없는 경우 csrfInput으로 대체가 가능함
<form action="${send}" method="post">
...
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
- JSON 사용 시 HTTP 헤더에 토큰을 제출할 수 있음
<html>
<head>
<meta name="_csrf" content="$_csrf.token}" />
<meta name="_csrf_header" content=""${_csrf.headerName}"" />
...
</head>
...
- CSRF 토큰은 HttpSession 메서드에 저장되므로 HttpSession 만료 시 Exception이 발생됨
- 해당 이슈를 해결하기 위해서 세션 만료 예정을 스크립트로 안내하고, 버튼 클릭을 통해 세션을 연장하도록 하여 문제 해결
- 로그아웃은 HTTP POST로만 제공하여 CSRF 토큰을 통해 악의적인 사용자에 의한 강제 로그아웃을 방지
보안헤더
- Cache-Control : 앱 브라우저에 캐시된 페이지를 제한하여 캐시에 포함된 정보 노출을 제한
- Content-Type Options : 여러 개의 Content-Type으로 이용할 수 있는 파일을 사용해 XSS 공격에 대한 컨텐츠 스니핑을 제한
- HSTS : HTTPS 로만 요청하도록 하여 중간자 공격의 발생 가능성을 줄이도록 함
- X-Frame-Option : 모든 사이트가 프레임 내에서 랜더링되지 않도록 하여 클릭재킹을 방어
- X-XSS-Protection : 컨텐츠 차단을 통해 XSS 공격을 제한
#SecurityConfig.java
...
@Override
protected void configure(HttpSecurity http) throws Exception {
...
http.headers()
.contentTypeOptions().and()
.xssProtection().and()
.cacheControl().and()
.httpStrictTransportSecurity().and()
.frameOptions().and()
...
}
반응형
'Security > Spring' 카테고리의 다른 글
Spring Security Summary (0) | 2023.04.16 |
---|---|
SpringBoot 기초 (0) | 2020.05.08 |
SpringBoot 소스진단 시 검색 키워드 (0) | 2020.05.04 |
댓글
반응형
최근에 올라온 글
- Total
- Today
- Yesterday