세션 정보 확인하기, 설정하기

Jaewoo Back·2024년 7월 13일
0

Spring Security공부

목록 보기
12/13
post-thumbnail

현재 사용자 정보를 불러오는 방법

세션 현재 사용자 아이디

SecurityContextHolder.getContext().getAuthentication().getName();

세션 현재 사용자 Role


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();

사용법

세션정보를 확인해야 하는 곳에 코드를 넣어서 값을 가지고 오면 된다.

예를들어 루트 페이지에서 사용자 정보를 보여주려면 다음과 같이 한다.


@Controller
public class MainController {


    @GetMapping("/")
    public String mainP(Model model) {
		
        // 루트 페이지를 response하는 매핑된 메소드에 세션 정보를 불러와 페이지에 넣는다.
        
       String username =
       		SecurityContextHolder.getContext().getAuthentication().getName();
        
        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();
        
        model.addAttribute("username",username);
        model.addAttribute("role",role);
        
        
        return "main";
    }
}

템플릿 소스에 들어가 문법에 맞게 데이터를 불러온다.


결과확인하기

로그인 전 세션 정보가 없기 때문에 나오지 않는다.

세션 설정


공식 홈페이지 세션 바로가기

로그인 정보
사용자가 로그인을 진행한 뒤 사용자 정보는 SecurityContextHolder에 의해서 서버 세션에 관리된다.

세션 소멸 시간 설정

세션 타임아웃 설정을 통해 로그인 이후 세션이 유지되고 소멸하는 시간을 설정한다.
세션 소멸 시점은 서버에 마지막 특정 요청(GET,POST,...)을 수행한 뒤 설정한 시간 만큼 유지된다.(기본시간 1800초)

//초 기반
server.servlet.session.timeout=1800


//분 기반
server.servlet.session.timeout=90m
// 세션 시간 초과 감지 ( 이미 만료된 세션으로 사용자가 요청할 때 특정 엔드포인트로 리디렉션 한다. 다음 예는 /login 특정 페이지로 리디렉션
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
    http
        .sessionManagement(session -> session
            .invalidSessionUrl("/login")
        );
    return http.build();
}

다중 로그인 설정

동일한 아이디로 다중 로그인을 진행할 경우에 대한 설정 방법은 세션 통제를 통해 진행한다.

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{

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

    return http.build();
}

sessionManagement() 메소드를 통한 설정을 진행한다.

maximumSession(정수) : 하나의 아이디에 대한 다중 로그인 허용 개수

maxSessionPreventsLogin(불린) : 다중 로그인 개수를 초과하였을 경우 처리 방법
기본값 : false

  • true : 초과시 새로운 로그인 차단
  • false : 초과시 기존 세션 하나 삭제

세션 고정 보호

세션 고정 공격을 보호하기 위한 로그인 성공시 세션 설정 방법은 sessionManagement() 메소드의 sessionFixation() 메소드를 통해서 설정할 수 있다.

  • sessionManagement().sessionFixation().none() : 로그인 시 세션 정보 변경 안함
  • sessionManagement().sessionFixation().newSession() : 로그인 시 세션 새로 생성
  • sessionManagement().sessionFixation().changeSessionId() : 로그인 시 동일한 세션에 대한 id 변경
  • 공식문서 코드
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) {
    http
        .sessionManagement((session) - session
            .sessionFixation((sessionFixation) -> sessionFixation
                .newSession()
            )
        );

    return http.build();
}
  • 구현 코드
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{

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

    return http.build();
}
profile
https://blog.naver.com/jaewoo2_25

0개의 댓글