티스토리 뷰

Security/Spring

Spring Security 보호기능

SalaYH 2023. 4. 17. 00:16
반응형

세션고정 공격

  • 로그인 인증 후에도 동일한 세션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