익명사용자 인증 필터
AnonymousAuthenticationFilter
SecurityContext
에 인증객체(Authentication
)가 존재하는지 아닌지 파악한다- 인증객체가 존재하지않는다면 익명의 사용자로 파악하여 익명사용자용 인증객채(
AnonymousAuthenticationToken
)를 생성하여 토큰 발급 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과 동일한 계정)
- 사용자2 세션 생성 : 서버에 동일한 계정의 세션이 2개인 상황
- 사용자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 로그인
- 동일한 계정의 세션이 있기때문에 인증예외 발생
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 : 공격자 쿠키값으로 인증되어있기 때문에
공격자는 사용자 정보를 공유
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 |