Spring/Security

스프링 시큐리티 - 2

훈지런 2022. 12. 5. 18:47

익명사용자 인증 필터

AnonymousAuthenticationFilter

  1. SecurityContext에 인증객체(Authentication)가 존재하는지 아닌지 파악한다
  2. 인증객체가 존재하지않는다면 익명의 사용자로 파악하여 익명사용자용 인증객채(AnonymousAuthenticationToken)를 생성하여 토큰 발급
  3. SecurityContext에 저장
  • 인증사용자와 익명사용자를 구분해서 처리하기위한 용도
  • 회원 인증여부를 구현할때 isAnonymous()isAuthenticated()로 구분해서 사용.

동시 세션 제어

최대 세션 허용 개수 초과했을때

1. 이전 사용자 세션 만료

sequenceDiagram autonumber actor U1 as 사용자 1 actor U2 as 사용자 2 participant S as Server U1 ->> S : 로그인 S ->> U1 : 세션 생성 U2 ->> S : 로그인 S ->> U2 : 세션 생성 - 이전 사용자 세션 만료 설정 U1 ->> S : 링크접속 S ->> U1 : 세션 만료
  1. 사용자1이 로그인
  2. 사용자1 세션이 생성되어있음
  3. 사용자2 로그인 (사용자1과 동일한 계정)
  4. 사용자2 세션 생성 : 서버에 동일한 계정의 세션이 2개인 상황
  5. 사용자1이 다시 접근할때 사용자1의 세션을 만료로 설정

2. 현재 사용자 인증 실패

sequenceDiagram autonumber actor U1 as 사용자 1 actor U2 as 사용자 2 participant S as Server U1 ->> S : 로그인 S ->> U1 : 세션 생성 U2 ->> S : 로그인 S ->> U2 : 인증 예외 발생
  1. 사용자1이 로그인
  2. 사용자1 세션이 생성
  3. 사용자2 로그인
  4. 동일한 계정의 세션이 있기때문에 인증예외 발생

http.sessionManagement() : 세션관리 기능 작동

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .maximumSessions(1) // 최대허용 가능 세션수, -1 : 무제한 로그인 세션 허용
        .maxSessionsPreventsLogin(false) // 동시로그인 차단, Default : false(기존세션 만료)
        .invalidSessionUrl("/test") // 세션이 유효하지 않을때 이동할 페이지
            .expiredUrl("/lhj") // 세션이 만료된 경우 이동할 페이지
    return http.build();
}

세션 고정 보호

세션 고정 공격

sequenceDiagram autonumber actor U as 사용자 actor A as 공격자 participant W as WebApp A ->> W : 접속 W ->> A : JSESSIONID = 123321 A ->> U : 공격자 세션쿠키 사용
JSESSIONID = 123321 U ->> W : 공격자 세션쿠키로 로그인 시도
JSESSIONID = 123321 W ->> U : 로그인 성공 A ->> W : JSESSIONID = 123321 note right of W : 공격자 쿠키값으로 인증되어있기 때문에
공격자는 사용자 정보를 공유
  • 공격 내용 : 공격자가 미리 발급받아둔 세션아이디로 로그인을 하기때문에 공격자가 사용자의 정보를 공유받는다.
  • 세션 고정 보호는 인증할때마다 새로운 새션을 생성하는 방식
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionFixation()
        .changeSessionId() // 기본값 (서블릿 3.1 이상에서 기보값)
        // .none() 침입에 속수무책으로 당하기 좋음
        // .migrateSession() 새로운 새션 생성 (서블릿 3.1 이하에서 기본값)
        // .newSession() 새션 새롭게 생성되기 이전의 속성값들을 사용하지못하고 새롭게 속성값을 설정해야함
    return http.build();
}

세션 정책

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.If_Required) // 기본값
    return http.build();
}
  • SessionCreationPolicy.Always : 항상 세션 생성
  • SessionCreationPolicy.If_Required : 필요시 생성 - 기본값
  • SessionCreationPolicy.Never : 생성하지 않지만 이미 존재하면 사용
  • SessionCreationPolicy.Statless : 생성도 안하고 사용도 안함 -> JWT같은 경우

'Spring > Security' 카테고리의 다른 글

스프링 시큐리티 - 3  (0) 2022.12.07
스프링 시큐리티 - 1  (0) 2022.12.02