[์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ธฐ๋ณธ API & Filter ์ดํ•ด] Remember Me ์ธ์ฆ & ํ•„ํ„ฐ

๐Ÿ“ ์ด ๊ธ€์€ ์ธํ”„๋Ÿฐ ์ธํ„ฐ๋„ท ๊ฐ•์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ - Spring Boot ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” Spring Security ์—์„œ ๊ธฐ๋ฐ˜๋œ ๊ฒƒ์œผ๋กœ ์—ฌ๊ธฐ์„œ ์ธ์šฉ๋˜๋Š” PPT ์ด๋ฏธ์ง€ ๋˜ํ•œ ๋ชจ๋‘ ํ•ด๋‹น ๊ฐ•์˜์—์„œ ๊ฐ€์ ธ์™”์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

๐Ÿ”น Remember Me

  • ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„์—๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ฌ์šฉ์ž๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๊ธฐ๋Šฅ
  • Remember-me ์ฟ ํ‚ค์— ๋Œ€ํ•œ HTTP ์š”์ฒญ์„ ํ™•์ธํ•œ ํ›„, ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ํ† ํฐ์ด ๊ฒ€์ฆ๋˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ๋œ๋‹ค.
  • ๋งŒ์•ฝ ์–ด๋–ค ์ด์œ ๋กœ๋“  ์ดํ›„์— ์ธ์ฆ ํ”„๋กœ์„ธ์Šค์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ๋กœ๊ทธ์•„์›ƒํ•˜๋ฉด ์ฟ ํ‚ค๋ฅผ ๋ฌดํšจํ™”ํ•œ๋‹ค.

 

๐Ÿ”น Remember Me API

Remember me ์‚ฌ์šฉ์€ src > main > java > io > security > basicsecurity > SecurityConfig ์ž‘์„ฑํ•œ๋‹ค.

์‚ฌ์šฉ์€ http.rememberMe()๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ์ด ์ž‘๋™ํ•˜๋ฉฐ, api๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// import ์ƒ๋žต

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Autowired
    UserDetailsService userDetailsService;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    	// ์ƒ๋žต

    	http
    		.rememberMe()
    		.rememberMeParameter("remember") // ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…, ๊ธฐ๋ณธ๋ช…์€ remember-me
    		.tokenValiditySeconds(3600) // ๋งŒ๋ฃŒ์‹œ๊ฐ„, ๊ธฐ๋ณธ์€ 14์ผ
    		// .alwaysRemember(true) 
    		// ๋กœ๊ทธ์ธ ์‹œ Remember-Me ๊ธฐ๋Šฅ ๋ฌด์กฐ๊ฑด ํ™œ์„ฑํ™”, false๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.
    		.userDetailsService(userDetailsService);
    		// ์‹œ์Šคํ…œ์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ์กฐํšŒํ•˜๋Š” ์ฒ˜๋ฆฌ ๊ณผ์ •์— ํ•„์š”ํ•œ ํด๋ž˜์Šค
    		// ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด
    		// "java.lang.IllegalStateException: UserDetailsService is required."
    		// ๋‚ด๋ถ€์ ์œผ๋กœ ์žฌ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
    	
        return http.build();
    }
}

 

๐Ÿ”น Remember Me Cookie ํ™•์ธ

[ ๋กœ๊ทธ์ธ ]

remember-me ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” ํ•˜๊ณ  ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด remember-me ์ฟ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํฌ๋กฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ธ EditThisCookie๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™•์ธํ–ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ป๋‹ค ์ผœ๋„ remember-me ์ฟ ํ‚ค๋Š” ๊ณ„์†ํ•ด์„œ ์กด์žฌํ•œ๋‹ค.

 

[ ๋กœ๊ทธ์•„์›ƒ ]

  • ๋กœ๊ทธ์•„์›ƒ ์ดํ›„ remember-me ์ฟ ํ‚ค๊ฐ€ ์‚ญ์ œ๋œ๋‹ค.

 

 


 

๐Ÿ”น RememberMeAuthenticationFilter

Remember Me์˜ ๊ธฐ๋Šฅ์„ ์‹ค์ œ ์ฒ˜๋ฆฌํ•˜๋Š” Filter ํด๋ž˜์Šค

 

๐Ÿ”น RememberMeAuthenticationFilter ๋™์ž‘ ๋ฐฉ์‹

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ์ „์— ํ•„ํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„ํ„ฐ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ• ์ง€ ๋ง์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

 

[ ๋™์ž‘ ์กฐ๊ฑด ]

  • ์ธ์ฆ ๊ฐ์ฒด ๋ถ€์žฌ
    • ์„ธ์…˜์ด ๋งŒ๋ฃŒ๋˜์–ด ์„ธ์…˜ ๋‚ด์— SecurityContext๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
    • SecurityContext ๋‚ด์— ์ธ์ฆ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
  • ์š”์ฒญ์— remember-me ์ฟ ํ‚ค ์กด์žฌ

์œ„ ๊ทธ๋ฆผ์—์„œ RememberMeServices๋Š” ์‹ค์ œ RememberMe ์ธ์ฆ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

[ RememberMeServices ์ข…๋ฅ˜ ]

  • TokenBasedRememberMeServices : ๋ฉ”๋ชจ๋ฆฌ์— ์‹ค์ œ๋กœ ์ €์žฅํ•œ ํ† ํฐ๊ณผ ์š”์ฒญํ•  ๋•Œ ๋“ค๊ณ  ์˜จ ์ฟ ํ‚ค๋ฅผ ๋น„๊ตํ•œ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ 14์ผ ๋™์•ˆ ๊ฐ–๊ณ  ์žˆ๋Š”๋‹ค.
  • PersistentToeknBasedRememberMeServices : DB์— ์ €์žฅ๋œ ํ† ํฐ์˜ ๊ฐ’๊ณผ ์š”์ฒญํ•  ๋•Œ ๋“ค๊ณ  ์˜จ ์ฟ ํ‚ค๋ฅผ ๋น„๊ตํ•œ๋‹ค.

 

RememberMeServices ๊ฐ์ฒด๊ฐ€ Token Cookie๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋“ค๊ณ  ์žˆ๋Š” Tocken์ด RememberMe Tocken์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

์กด์žฌํ•˜๋ฉด ํ•ด๋‹น ํ† ํฐ์„ ๋””์ฝ”๋”ฉํ•˜๊ณ , ์„œ๋ฒ„์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ Tocken์„ ๋น„๊ตํ•œ๋‹ค.

์ผ์น˜ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํ† ํฐ ์•ˆ์— ์žˆ๋˜ User ๊ณ„์ •์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์กด์žฌํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด Authentication์„ ์ƒ์„ฑํ•˜๊ณ  AuthenticationManager์—๊ฒŒ ์‹ค์ œ ์ธ์ฆ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.

 

 

 

 

 

๐Ÿ“ƒ reference