공부/Spring

Spring security와 authentication 처리과정

JangGiraffe 2025. 1. 22. 21:28

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_인증 후 통신 흐름

  1. 사용자가 요청 시점에서 세션이 없는 경우 WAS에서 세션을 생성하며 이 과정에서 JSESSIONID도 같이 발급된다.
    • 해당 값은 was의 server.xml에서 확인할 수 있음.
  2. 인증이 성공하면 AuthenticationFilter에서 SecurityContextHolder > SecurityContext > Authentication 객체 안에 인증정보를 담고, 이를 세션 객체에 저장하며 세션서버에 인증정보를 저장함.
    • 이 때 세션서버에 조회하는 키는 JSESSIONID
    • 세션 서버 또한 was에서 설정할 수 있다.
    • LENA
  3. 클라이언트에게 JSESSIONID를 쿠키로 남김
  4. 이후 클라이언트가 WAS와 HTTP 통신시 헤더의 쿠키영역에 JSESSIONID값을 넣어서 요청함
  5. 요청을 받은 WAS는 세션서버에서 받은 JSESSIONID을 조회하고 세션서버는 JSESSIONID에 해당하는 인증정보(SecurityContext)를 WAS로 전달함
    • 세션정보가 없거나 만료됐다면 새로운 세션을 생성함
    • 해당 시스템에서는 세션이 만료되면 로그인페이지로 이동시킴

protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement()
            .maximumSessions(1)
            .expiredUrl("/login.do") // < 만료 시..
            .maxSessionsPreventsLogin(true)
            .sessionRegistry(sessionRegistry());
}
반응형