Post

[Spring Security] formLogin

[Spring Security] formLogin

๐Ÿ“Œ formLogin ๋ฉ”์„œ๋“œ๋ž€?

formLogin ๋ฉ”์„œ๋“œ๋Š” ๋กœ๊ทธ์ธ ํผ์„ ํ†ตํ•œ ์ธ์ฆ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๐Ÿ“Œ formLogin API

loginPage

loginPage ๋Š” Spring Security๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋กœ๊ทธ์ธ ํผ ๋Œ€์‹  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ๋กœ๊ทธ์ธ ํผ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

loginProcessingUrl

loginProcessingUrl ๋ฉ”์„œ๋“œ์—๋Š” ์ธ์ฆ ์ ˆ์ฐจ๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ ์ˆ˜ํ–‰ํ•  ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. ํ•ด๋‹น URL๋กœ ์ž๊ฒฉ ์ฆ๋ช…์ด ๋“ค์–ด์˜ค๋ฉด UsernamePasswordAuthenticationFilter ๊ฐ€ ์ด๋ฅผ ๊ฐ€๋กœ์ฑ„์„œ AuthenticationManager ์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค. ์ดํ›„ UserDetailService ๊ตฌํ˜„์ฒด๋ฅผ ์ฐพ์•„ loadUserByUsername ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฆฌํ„ด๋œ UserDetails ๊ฐ์ฒด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค. ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๊ถŒํ•œ์„ ๋‹ด์•„ Authentication ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ํ›„ SecurityContext ์— ์ €์žฅํ•œ๋‹ค.

defaultSuccessUrl

defaultSuccessUrl ์€ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ์ด๋™ํ•  ๊ธฐ๋ณธ URL์„ ์ง€์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ๋‹ค๋งŒ ๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ํ•ญ์ƒ defaultSuccessUrl ์— ๋ช…์‹œ๋œ URL๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•  ๋•Œ, ์›๋ž˜ ๊ฐ€๋ ค๊ณ  ํ•œ URL์„ ์„ธ์…˜์˜ RequestCache ์— SavedRequest ๊ฐ์ฒด๋กœ ์ €์žฅํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ SavedRequest ๊ฐ€ ์—†๋‹ค๋ฉด defaultSuccessUrl ์— ๋ช…์‹œ๋œ URL๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ SavedRequest ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ๋ฌด์กฐ๊ฑด defaultSuccessUrl ์˜ URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ alwaysUse ์˜ ๊ฐ’์„ true ๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

๋‹ค๋งŒ defaultSuccessUrl ์„ค์ •์€ ํ›„์ˆ ํ•  successHandler ๊ฐ€ ์„ค์ •๋˜์—ˆ๋‹ค๋ฉด ์™„์ „ํžˆ ๋ฌด์‹œ๋œ๋‹ค.

failureUrl

failureUrl ์€ ๋กœ๊ทธ์ธ ์‹œ๋„๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์–ด๋А URL๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค.

failureUrl ๋˜ํ•œ failureHandler ๊ฐ€ ์„ค์ •๋˜์—ˆ๋‹ค๋ฉด ์™„์ „ํžˆ ๋ฌด์‹œ๋œ๋‹ค.

usernameParameter

usernameParameter ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์šฉ์ž ์•„์ด๋””๋ฅผ ์–ด๋–ค HTTP ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„์ง€ ์•Œ๋ ค์ค€๋‹ค. ์ด ์„ค์ •์— ๋”ฐ๋ผ ์ถ”์ถœ๋œ ๊ฐ’์ด loadUserByUsername ๋ฉ”์„œ๋“œ์˜ username ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

passwordParameter

passwordParameter ๋˜ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„์ง€ ์•Œ๋ ค์ฃผ๋Š” ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ถ”์ถœ๋œ ๊ฐ’์€ UserDetails ์— ์ €์žฅ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ ํ•ด์‹œ ๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์ธ์ฆํ•œ๋‹ค.

failureHandler

failureUrl ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹จ์ˆœํžˆ URL์„ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด failureHandler ๋Š” ๋” ๋‹ค์–‘ํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. AuthenticationFailureHandler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ SimpleUrlAuthenticationFailureHandler ๋ฅผ ์ƒ์†ํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

1
2
3
4
5
6
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
		AuthenticationException exception) throws IOException, ServletException {
	
	// ...
}

๋ณดํ†ต onAuthenticationFailure ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, HttpServletRequest ์—์„œ ์š”์ฒญ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ณ , HttpServletResponse ์—์„œ ๋ฆฌ๋””๋ ‰์…˜๊ฐ™์€ ์‘๋‹ต์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. exception ์„ ํ†ตํ•ด ์˜ˆ์™ธ ํƒ€์ž…์„ ํ™•์ธํ•˜์—ฌ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

successHandler

successHandler ๋˜ํ•œ defaultSuccessUrl ๋ณด๋‹ค ์ •๊ตํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. AuthenticationSuccessHandler ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ SimpleAuthenticationSuccessHandler ๋ฅผ ์ƒ์†๋ฐ›์•„ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.