Skip to content

Spring Security

Yang-soeun edited this page Sep 9, 2024 · 3 revisions

SecurityFilterChain

image

์ „์ฒด์ ์ธ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ๋ฆ„

image
  1. Http Request ์ˆ˜์‹ 
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ธ์ฆ ์š”์ฒญ์„ ํ•œ๋‹ค.
  1. AuthenticationFilter๊ฐ€ ์š”์ฒญ์„ ๊ฐ€๋กœ์ฑ„๊ณ , ๊ฐ€๋กœ์ฑˆ ์ •๋ณด๋กœ UsernamePasswordAuthenticationToken์˜ ์ธ์ฆ ์šฉ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. AuthenticationManager์˜ ๊ตฌํ˜„์ฒด์ธ ProviderManger์—๊ฒŒ ์•ž์„œ ์ƒ์„ฑํ•œ UsernamePasswordToken ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
  3. AuthenticationManager๋Š” ๋“ฑ๋ก๋œ AuthenticationProvider ๋ฆฌ์ŠคํŠธ ์ค‘์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” provider์—๊ฒŒ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ์œ„์ž„ํ•œ๋‹ค.
  4. ์•ž์„œ ์„ ํƒ๋œ AuthenticationProvider๊ฐ€ ๋“ฑ๋ก๋œ UserDetailsService(์ง์ ‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ)์—๊ฒŒ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋œ๋‹ค.
  5. UserDetailsService๋Š” ๋„˜๊ฒจ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ†ตํ•ด DB์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ฐพ๊ฒŒ๋˜๊ณ , ์ฐพ์€ ์ •๋ณด๋กœ UserDetails ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ๋„˜๊ฒจ์ค€๋‹ค.(UserDetails ์ง์ ‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ)
  6. AuthenticationProvider ๋“ค์€ UserDetails๋ฅผ ๋„˜๊ฒจ ๋ฐ›๊ณ , UsernamePasswordAuthenticationToken์˜ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋น„๊ตํ•œ๋‹ค.
  7. ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด AuthenticationManager(ProviderManager)๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ถŒํ•œ ๋“ฑ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
  8. AuthenticationFilter์— Authentication๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜ ๋˜์–ด์ง„๋‹ค.
  9. SecurityContext์˜ ์˜์—ญ์— Authentication๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์ฆ‰, 10๋ฒˆ๊นŒ์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด SecurityContextHolder๋Š” ์„ธ์…˜ ์˜์—ญ์— ์žˆ๋Š” SecurityContext์— Authentication ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

**PICKME์— ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์ ์šฉํ•˜๊ธฐ ~ **

WebSecurityConfig.java ์„ค๋ช…

	@Bean
	public WebSecurityCustomizer webSecurityCustomizer() {
		return (web) -> web.ignoring()
			.requestMatchers(
				PathRequest.toStaticResources().atCommonLocations()
			);
	}
  • ์ด๋ถ€๋ถ„์€ css, js, ์ด๋ฏธ์ง€ ๋“ฑ **์ •์  ๋ฆฌ์†Œ์Šค**์— ๋Œ€ํ•œ ๋ณด์•ˆ์„ ์ ์šฉํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์„ค์ •ํ•œ ๋ถ€๋ถ„

	@Bean
	public SecurityFilterChain userfilterChain(HttpSecurity http) throws Exception {
		AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
		configureAuthenticationManager(managerBuilder, userDetailService);

		return commonSecurityFilter(http, "/user/**", "/user/loginForm", "/user/login", "/user/loginForm?error=true");
	}

	@Bean
	public SecurityFilterChain adminfilterChain(HttpSecurity http) throws Exception {
		AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
		configureAuthenticationManager(managerBuilder, customosDetailService);

		return commonSecurityFilter(http, "/customs/**", "/customs/loginForm", "/customs/login", "/customs/loginForm?error=true");
	}

ํ˜„์žฌ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ด€๋ฆฌ์ž(Customs)์™€ ์‚ฌ์šฉ์ž(User)๊ฐ€ ๋”ฐ๋กœ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—

๊ฐ๊ฐ์˜ ๋ณด์•ˆ ์„ค์ •์„ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ํ–ˆ๋‹ค.

  • SecurityFilterChain์„ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ, ์š”์ฒญ ๊ฒฝ๋กœ๋ณ„๋กœ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ณด์•ˆ ์„ค์ •์„ ์ ์šฉํ•œ๋‹ค.
  • userFilterChain
    • /user/** ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ณด์•ˆ ์„ค์ • ์ ์šฉ
    • ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์œ„ํ•ด userDetailService๋ฅผ ์„ค์ •
  • adminFilterChain()
    • /customs/** ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ณด์•ˆ ์„ค์ • ์ ์šฉ
    • ๊ด€๋ฆฌ์ž ์ธ์ฆ์„ ์œ„ํ•ด customosDetailService๋ฅผ ์„ค์ •

	private void configureAuthenticationManager(AuthenticationManagerBuilder managerBuilder, UserDetailsService userDetailsService) throws Exception {
		managerBuilder.userDetailsService(userDetailsService)
			.passwordEncoder(bCryptPasswordEncoder());
	}
  • ๊ณตํ†ต ๋ณด์•ˆ ์„ค์ • ๋ฉ”์„œ๋“œ
  • ์ฃผ์–ด์ง„ UserDetailService์™€ BcryptPasswordEncoder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ ๊ด€๋ฆฌ์ž(AuthenticationManager)๋ฅผ ๊ตฌ์„ฑ

	private SecurityFilterChain commonSecurityFilter(HttpSecurity http, String securityMatcher, String loginPage, String loginProcessingUrl, String failureRedirectUrl) throws Exception {
		http
			.securityMatcher(securityMatcher)
			.formLogin(AbstractHttpConfigurer::disable)
			.cors(AbstractHttpConfigurer::disable)
			.csrf(AbstractHttpConfigurer::disable)
			.authorizeHttpRequests((authorize) -> authorize
				.requestMatchers(securityMatcher).permitAll()
				.anyRequest().authenticated())
			.formLogin(form -> form
				.loginPage(loginPage)
				.usernameParameter("id")
				.loginProcessingUrl(loginProcessingUrl)
				.successHandler(authenticationSuccessHandler())
				.failureHandler((request, response, exception) -> {
					response.sendRedirect(failureRedirectUrl);
				}).permitAll()
			)
			.sessionManagement(sessionManagementConfigurer ->
				sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
					.sessionFixation(SessionManagementConfigurer.SessionFixationConfigurer::changeSessionId)
					.maximumSessions(1)
					.maxSessionsPreventsLogin(true)
					.expiredUrl(loginPage));

		return http.build();
	}
  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€, ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ, URL ์ฒ˜๋ฆฌ, ์„ฑ๊ณต/์‹คํŒจ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์„ ์„ค์ •
  • authenticationSuccessHandler() ์ธ์ฆ ์„ฑ๊ณต ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์— ๋”ฐ๋ผ redirect ํ•  ์„ฑ๊ณต ํ™”๋ฉด์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•จ(์ •ํ™•ํ•œ ๊ตฌํ˜„์€ ์ฝ”๋“œ ์ฐธ๊ณ !)

์—ฌ๊ธฐ๊นŒ์ง€ ์ „์ฒด์ ์ธ ํ๋ฆ„์€

  1. ์‚ฌ์šฉ์ž๊ฐ€ /user/loginForm URL๋กœ GET ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
    • Spring Security๋Š” ์ด ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  2. SecufityFilterChain ํƒ์ƒ‰
    • Spring Security๋Š” ์š”์ฒญ URL์ด /user/** ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์ด ํŒจํ„ด์€ userFilterChain(HttpSecurity http) ๋ฉ”์„œ๋“œ์—์„œ ์„ค์ •๋œ SecurityFilterChain์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.
  3. Form Login ์„ค์ • ํ™•์ธ
    • userFilterChain ๋ฉ”์„œ๋“œ์˜ commonSecuiryFilter ๋ฉ”์„œ๋“œ์—์„œ formLogin() ์„ค์ •์„ ํ™•์ธํ•ด์„œ ์„ค์ •๋œ loginPage์ธ /user/loginForm์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™
  4. ๋กœ๊ทธ์ธ ํผ ์ œ๊ณต
    • /user/loginForm ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ username, password๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  5. ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€ ์ž‘๋™
    • ์‚ฌ์šฉ์ž๋Š” id ์™€ password๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ํผ์„ ์ œ์ถœ
    • ์ด๋•Œ loginProcessingUrl๋กœ ์ง€์ •๋œ /user/login ์œผ๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.
  6. ๋กœ๊ทธ์ธ ์ธ์ฆ ์ฒ˜๋ฆฌ
    • /user/login ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด, Spring Security๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ id์™€ password๋ฅผ userDetailService๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆํ•œ๋‹ค.
    • userDetailService๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ž…๋ ฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋งž๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  7. ์ธ์ฆ ์„ฑ๊ณต/์‹คํŒจ ์ฒ˜๋ฆฌ
    • ๋งŒ์•ฝ ์ธ์ฆ์ด ์„ฑ๊ณตํ•˜๋ฉด ์œ„์—์„œ ์„ค์ •ํ•œ .successHandler(authenticationSuccessHandler()) ์— ์„ค์ •ํ•œ ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค
    • ์‹คํŒจํ•œ ๊ฒฝ์šฐ .failureHandler ์„ค์ •ํ•œ ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.

์ดํ›„์˜ ๊ณผ์ •์€ ์œ„์—์„œ ์‹œํ๋ฆฌํ‹ฐ ํ๋ฆ„์˜ 8๋ฒˆ ์ดํ›„ ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค.

8๋ฒˆ ์ดํ›„์— ์ƒ์„ฑ๋œ Authenticaition ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด์„œ @CurrentUser ์–ด๋…ธํ…Œ์ด์…˜์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋กœ๊ทธ์ธ ๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค!(์ด ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ๊ณณ์— ์ •๋ฆฌ)


Spring Security ์„ธ์…˜ ๊ด€๋ฆฌ

			.sessionManagement(sessionManagementConfigurer ->
				sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
					.sessionFixation(SessionManagementConfigurer.SessionFixationConfigurer::changeSessionId)
					.maximumSessions(1) //ํ•œ ์œ ์ €๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์„ธ์…˜ ๊ฐœ์ˆ˜
					.maxSessionsPreventsLogin(true)
					.expiredUrl("/user/loginForm"));
  • maximumSession(1): ์ตœ๋Œ€ ํ—ˆ์šฉ ๊ฐ€๋Šฅ ์„ธ์…˜ ์ˆ˜๋ฅผ ์„ค์ •
    • -1๋กœ ๋„ฃ์œผ๋ฉด ๋ฌด์ œํ•œ ์„ธ์…˜ ์ƒ์„ฑ ํ—ˆ์šฉ
  • maxSessionPreventsLogin(true): ์œ„์—์„œ ์„ค์ •ํ•œ ์ตœ๋Œ€ ํ—ˆ์šฉ ์„ธ์…˜์˜ ์ˆ˜๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ์ถ”๊ฐ€์ ์ธ ์ธ์ฆ์ด ์žˆ์„ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์„ค์ •
    • true๋ฉด ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹คํŒจ, false(default)๋ฉด ๊ธฐ์กด ์„ธ์…˜ ๋งŒ๋ฃŒ
  • expiredUrl(โ€/user/loginFormโ€): ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ ์ด๋™ ํ•  ํŽ˜์ด์ง€๋ฅผ ์„ค์ •

maximumSession(1) ์ตœ๋Œ€ ์„ธ์…˜ ๊ฐœ์ˆ˜์ผ ๋•Œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•

  1. ์ด์ „ ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋งŒ๋ฃŒ
  • ์‚ฌ์šฉ์ž 1์ด ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„์— ํ•ด๋‹น ๊ณ„์ •์— ๋Œ€ํ•œ ์„ธ์…˜์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž 2๊ฐ€ ์‚ฌ์šฉ์ž1๊ณผ ๋™์ผ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ filter ์ค‘ SessionManageMentFilter์—์„œ maximumSession()์˜ ๊ฐ’์ด 1์ธ ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.
  • ์„œ๋ฒ„๋Š” ์ƒˆ๋กญ๊ฒŒ ์ ‘๊ทผ์„ ์‹œ๋„ํ•œ ์‚ฌ์šฉ์ž 2์˜ ์„ธ์…˜์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ธ์ฆ์„ ํ•ด์ฃผ๋ฉฐ ์‚ฌ์šฉ์ž 1์˜์„ธ์…˜์€ session.isExpired() == true๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์„ธ์…˜ ๋งˆ๋ฃŒ ์„ค์ •์„ ํ•ด์ค€๋‹ค.
  • ์‚ฌ์šฉ์ž 1์ด ๋‹ค์‹œ request๋ฅผ ์š”์ฒญํ•˜๋ฉด ConcurrentSessionFilter์—์„œ session.isExpired()๊ฐ’์„ ํ™•์ธํ•˜์—ฌ ์„ธ์…˜ ๋งŒ๋ฃŒ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ›„ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ๋งŒ๋“ค๋„๋ก ์ธ์ฆ ์š”์ฒญ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
  1. ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹คํŒจ
  • ์‚ฌ์šฉ์ž 1์ด ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด ์„œ๋ฒ„์— ํ•ด๋‹น ๊ณ„์ •์— ๋Œ€ํ•œ ์„ธ์…˜์ด ์ƒ์„ฑ๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž 2๊ฐ€ ์‚ฌ์šฉ์ž1๊ณผ ๋™์ผ ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋˜๋ฉด ์—ฌ๋Ÿฌ filter ์ค‘ SessionManageMentFilter์—์„œ maximumSession()์˜ ๊ฐ’์ด 1์ธ ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.
  • ์„œ๋ฒ„์—์„œ๋Š” ์‚ฌ์šฉ์ž 2์˜ ์„ธ์…˜์„ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ  ์ธ์ฆ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

๐Ÿ’ก**์„ธ์…˜ ๊ด€๋ จ ํ•„ํ„ฐ

ConcurrentSessionFilter**

  • ๋งค ์š”์ฒญ๋งˆ๋‹ค ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜์˜ session.isExpired() ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์—ฌ ์„ธ์…˜์ด ๋งŒ๋ฃŒ ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋กœ๊ทธ์•„์›ƒ์ฒ˜๋ฆฌ(๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ)๋ฅผ ํ•ด์ฃผ๋Š” ํ•„ํ„ฐ

SessionManageMentFilter

  • ๋™์‹œ์  ์„ธ์…˜ ์ œ์–ด, ์„ธ์…˜ ๊ณ ์ • ๋ณดํ˜ธ, ์„ธ์…˜ ์ƒ์„ฑ ์ •์ฑ… ๋“ฑ์˜ ์„ธ์…˜์˜ ์ „๋ฐ˜์ ์ธ ๊ด€๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” ํ•„ํ„ฐ

์„ธ์…˜ ๊ณ ์ • ๋ณดํ˜ธ

        http.sessionManagement()
                .sessionFixation().changeSessionId()
  • changeSesseionId(): ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ์ž ์„ธ์…˜์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์„ธ์…˜ ์•„์ด๋””๋งŒ ๋ณ€๊ฒฝ ํ•œ๋‹ค
  • migrateSession(): ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์„ธ์…˜ ์•„์ด๋””๋„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•˜๋ฉฐ migrationํ•œ๋‹ค.(์„œ๋ธ”๋ฆฟ 3.1์ด์ „์—์„œ ๊ธฐ๋ณธ ๊ฐ’)
  • newSession(): ์ƒˆ๋กœ์šด ์„ธ์…˜ ์•„์ด๋””๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ ์ด์ „์˜ ์„ค์ • ๊ฐ’๋“ค์„ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • none(): ์•„๋ฌด๋Ÿฐ ๋ณดํ˜ธX

chageSessionId(), migrateSession()์€ ์ด์ „ ์„ธ์…˜์˜ ์„ค์ • ๊ฐ’๋“ค์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ newSession()์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์„ธ์…˜์„ ์ƒ์„ฑํ•˜์—ฌ ์ด์ „ ์„ค์ • ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์„ธ์…˜ ์ •์ฑ… ์„ค์ •

 http.sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.If_Required)
  • SessionCreationPolicy.Always: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ํ•ญ์ƒ ์„ธ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.
  • SessionCreateionPolicy.If_Required: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ํ•„์š”์‹œ ์ƒ์„ฑํ•œ๋‹ค.(default)
  • SessionCreateionPolicy.Never: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ƒ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์‚ฌ์šฉํ•œ๋‹ค.
  • SessionCreateionPolicy.Stateless: ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์กด์žฌํ•ด๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.(JWT์™€ ๊ฐ™์ด ์„ธ์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•จ)