spring security는?
- 스프링 기반의 애플리케이션 보안을 담당하는 스프링의 하위 프레임워크.
인증(Authentication)
과권한
을 Filter(AuthenticationFilter)로 처리한다.
왜 써야 함?
- 인증,권한, 보안과 공격 방어관련 다양한 기능을 제공 함(공격에 해당하는 방어코드를 하나하나 짜면 코스트가 너무 소모됨)
아키텍처 및 흐름
1 : 외부로 부터 들어오는 Http RQ
2 : Filter가 Token생성(id,pw 등등을 담고 있다)
3~4 : ProviderManager가 N개의 AuthenticationProvider를 순회하며 현재 해당하는 인증을 찾아 수행한다.
5~7 : 토큰에 해당하는 DB로 부터 User 정보를 가져온다.
8~10 : 찾은 인증정보를 SecurityContextHolder>SecurityContext>Authentication 객체 안에 담는다.
spring security 주요 모듈
SecurityContextHolder
- 보안 주체의 세부 정보를 포함해서 현재 보안 컨텍스트에 대한 세부 정보가 저장됨
SecurityContext
- Authentication을 보관하는 역할로 SecurityContext 를 통해 Authentication 객체를 꺼내올 수 있다.
Authentication
- 현재 접근하는 주체의 정보와 권한을 담는 인터페이스.
- principal : 식별된 사용자 정보 보관(주로 ID 정보)
- details : 현재세션(user)의 디테일 정보
- credentials : 사용자의 자격증명 (주로 비밀번호)
UserDetailService
- 세션에 저장되는 주체인 UserDetail을 반환하는 인터페이스(주로 커스텀해서 사용함)
스프링 시큐리티 JSP 사용 표현
<sec:authentication property="user" var="userInfo" /> //위 아키텍처 6번에서 가져온 UserInfo
<c:if test="${userInfo.partAdmin eq false}" >
<div>이렇게 쓰면 됩니다.</div>
</c:if>
Spring security와 authentication_2_인증 후 통신 흐름
- 사용자가 요청 시점에서 세션이 없는 경우 WAS에서 세션을 생성하며 이 과정에서
JSESSIONID
도 같이 발급된다.- 해당 값은 was의 server.xml에서 확인할 수 있음.
- 인증이 성공하면 AuthenticationFilter에서 SecurityContextHolder > SecurityContext > Authentication 객체 안에 인증정보를 담고, 이를 세션 객체에 저장하며 세션서버에 인증정보를 저장함.
- 이 때 세션서버에 조회하는 키는
JSESSIONID
임 - 세션 서버 또한 was에서 설정할 수 있다.
- 이 때 세션서버에 조회하는 키는
- 클라이언트에게
JSESSIONID
를 쿠키로 남김 - 이후 클라이언트가 WAS와 HTTP 통신시 헤더의 쿠키영역에
JSESSIONID
값을 넣어서 요청함 - 요청을 받은 WAS는 세션서버에서 받은
JSESSIONID
을 조회하고 세션서버는JSESSIONID
에 해당하는 인증정보(SecurityContext)를 WAS로 전달함- 세션정보가 없거나 만료됐다면 새로운 세션을 생성함
- 해당 시스템에서는 세션이 만료되면 로그인페이지로 이동시킴
protected void configure(HttpSecurity http) throws Exception {
http.sessionManagement()
.maximumSessions(1)
.expiredUrl("/login.do") // < 만료 시..
.maxSessionsPreventsLogin(true)
.sessionRegistry(sessionRegistry());
}
반응형