세션 현재 사용자 아이디
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
세션 고정 공격을 보호하기 위한 로그인 성공시 세션 설정 방법은 sessionManagement() 메소드의 sessionFixation() 메소드를 통해서 설정할 수 있다.
@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();
}