포스트

07.세션

세션 정보

  • 시큐리티는 인증과 인가가 완료되면 세션에 저장해둔다
  • 사용자의 정보가 저장된 Authentication은 SecurityContext에 있고, SecurityContext는 SecurityContextHolder에 있다.

  • 세션 현재 사용자 아이디
1
SecurityContextHolder.getContext().getAuthentication().getName();
  • 세션 현재 사용자 role
1
2
3
4
5
6
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
Iterator<? extends GrantedAuthority> iter = authorities.iterator();
GrantedAuthority auth = iter.next();
String role = auth.getAuthority();

세션 설정

로그인 정보
  • 사용자가 로그인을 진행한 뒤 사용자 정보는 SecurityContextHolder에 의해서 서버 세션에 관리된다
  • 이 때 세션의 소멸 시간, 아이디당 세션 생성 개수를 설정할 수 있다
세션 소멸 시간 설정. application.properties에 설정
1
2
3
4
5
//초 기반
server.servlet.session.timeout=1800

//분 기반
server.servlet.session.timeout=90m
다중 로그인 설정
1
2
3
4
5
6
7
8
9
10
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{

  http
          .sessionManagement((auth) -> auth
                  .maximumSessions(1)
                  .maxSessionsPreventsLogin(true));

  return http.build();
}
  • 동일한 아이디로 다중 로그인을 진행할 경우에 대한 설정 방법은 세션 통제를 통해 진행된다.
  • sessionManagement() : 메소드를 통해 설정한다
  • maximumSession(int) : 하나의 아이디에 대한 다중 로그인 허용 개수
  • maxSessionsPreventsLogin(boolean) : 다중 로그인 개수를 초괗였을 경우 처리 방법이다
    • true : 초과 시 새로운 로그인 차단
    • false : 초과 시 기존 세션 하나 삭제
세션 고정 보호

  1. 해커는 서버에 접근하여 정상 세션을 발급 받는다
  2. 해커는 유저(admin)에게 해커가 받은 정상 세션을 강제로 Set-Cookie하고 웹으로 리다이렉트하는 스크립트를 메일로 전송한다
  3. 유저는 해커가 보낸 메일을 확인하고 스크립트를 실행한다
  4. 유저는 서버에 접근할 때 해커와 같은 세션으로 접근하게 된다
  5. 유저는 정상적으로 관리자 페이지에 로그인한다
  6. 관리자 페이지에 로그인(인증절차)를 하여도 세션이 로그인 전후로 바뀌지 않는다
  7. 해커와 유저는 동일한 세션을 사용하기 때문에 해커는 새로고침을 할 때 관리자 권하을 가져온다.

  • sessionManagement().sessionFixation().none() : 로그인 시 세션 정보 변경 안함
  • sessionManagement().sessionFixation().newSession() : 로그인 시 세션 새로 생성
  • sessionManagement().sessionFixation().changeSessionId() : 로그인 시 동일한 세션에 대한 id 변경

  • 공식 문서 코드
1
2
3
4
5
6
7
8
9
10
11
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
  http
      .sessionManagement((session) - session
          .sessionFixation((sessionFixation) -> sessionFixation
              .newSession()
          )
      );

  return http.build();
}
  • 구현코드
1
2
3
4
5
6
7
8
9
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{

    http
        .sessionManagement((auth) -> auth
            .sessionFixation().changeSessionId());

    return http.build();
}
참고 사이트

개발자 유미