๐Ÿ’ป ์ฝ”๋”ฉ ์ผ๊ธฐ : [๊ฒŒ์‹œํŒ JSP] 'ํšŒ์˜๋ก'

ybkยท2024๋…„ 7์›” 8์ผ

spring

๋ชฉ๋ก ๋ณด๊ธฐ
32/55
post-thumbnail

๐Ÿ“– ๋‚ด์šฉ

์ด ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ฐ€์ž…ํ•˜๊ณ , ๊ฒŒ์‹œ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์‹œํŒ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ™‹โ€โ™‚๏ธ ์—ญํ• 

ํšŒ์›๊ฐ€์ž…


ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฉ”์ผ, ํŒจ์Šค์›Œ๋“œ, ๋‹‰๋„ค์ž„์„ ์ž…๋ ฅ ๋ฐ›์•„ ์„œ๋ฒ„๋กœ ํ•ด๋‹น ํšŒ์› ์ •๋ณด๋ฅผ ์ „์†กํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ ์ค‘๋ณต ํ™•์ธํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • Spring Security : ํšŒ์› ๊ฐ€์ž…๊ณผ ๊ด€๋ จ๋œ ์š”์ฒญ์€ ๋ณด์•ˆ ์„ค์ •์—์„œ ํŠน์ • URL์— ๋Œ€ํ•ด ์ธ์ฆ ์—†์ด ์ ‘๊ทผ์„ ํ—ˆ์šฉ์‹œํ‚ต๋‹ˆ๋‹ค. http.formLogin(login -> login.loginPage("/member/login"));
  • ์ด๋ฉ”์ผ ์ค‘๋ณต ํ™•์ธ : ํด๋ผ์ด์–ธํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ fetch ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ajax ๋กœ ์„œ๋ฒ„์— ์ „์†กํ•˜๊ณ  ์„œ๋ฒ„์—์„œ๋Š” ์ด๋ฉ”์ผ ๊ฐ’์„ ๋ฐ›์•„ ํ˜„์žฌ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์ด๋ฉ”์ผ๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” : ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ „์†ก๋ฐ›์€ ํŒจ์Šค์›Œ๋“œ๋ฅผ BCryptPasswordEncoder ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅ ์‹œ ์•”ํ˜ธํ™”๋œ ์ฑ„๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์› ์ •๋ณด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋  ๋•Œ, ํšŒ์› ๊ฐ€์ž… ์ผ์ž๋„ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ.gif

๋กœ๊ทธ์ธ


  • OAuth2 ์†Œ์…œ ๋กœ๊ทธ์ธ ํ๋ฆ„ ์•Œ๊ธฐ ( ex) ๋„ค์ด๋ฒ„ )

!https://velog.velcdn.com/images/kpo12345/post/8b44a1bb-42c0-43d4-a10e-5e34581b1556/image.png

  • OAuth2 ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด SecurityFilterChain์—์„œ ์„ค์ •ํ•ด์ค๋‹ˆ๋‹ค.
@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        http.csrf(csrf -> csrf.disable())
                .formLogin(login -> login.loginPage("/member/login"))
                .authorizeHttpRequests(authorize -> authorize
                        .anyRequest()
                        .permitAll()
                )
                // OAuth2 ๋กœ๊ทธ์ธ ๊ตฌ์„ฑ์„ ์œ„ํ•œ ์„ค์ • ๊ฐ€์ ธ์˜ด
                .oauth2Login(oauth2 -> oauth2
                        // ์‚ฌ์šฉ์ž ์ •๋ณด ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•œ ์„ค์ • ์ถ”๊ฐ€
                        .userInfoEndpoint(infoEndpoint ->
                                // ์‚ฌ์šฉ์ž ์„œ๋น„์Šค ๊ตฌ์„ฑ(๋กœ๊ทธ์ธ ์„ฑ๊ณต ํ›„ ์‚ฌ์šฉ์ž ์ •๋ณด ์ฒ˜๋ฆฌ)
                                infoEndpoint.userService(oauth2UserService)));
        return http.build();
    }
  • ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ ๊ตฌํ˜„
    • OAuth2MemberInfo ์ธํ„ฐํŽ˜์ด์Šค : ๋„ค์ด๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•„์š”ํ•œ response ์˜ ํ˜•์‹์ด Map์ด๊ธฐ ๋•Œ๋ฌธ์— Map์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Oauth2MemberService : ๋„ค์ด๋ฒ„ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ****๋ฐ›์€ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ด๋ฒ„๋กœ๊ทธ์ธ.gif

ํšŒ์› ์ •๋ณด ์ˆ˜์ • ๋ฐ ํƒˆํ‡ด


์ˆ˜์ • : ํด๋ผ์ด์–ธํŠธ๋Š” ํŠน์ • ํšŒ์›์˜ ์ €์žฅ๋œ ์ด๋ฉ”์ผ, ๋‹‰๋„ค์ž„์„ ๋ฐ›์•„์™€์„œ ์ˆ˜์ •ํ•  ๋ถ€๋ถ„(ํŒจ์Šค์›Œ๋“œ, ๋‹‰๋„ค์ž„)์„ ์ˆ˜์ •ํ•œ ํ›„ ์„œ๋ฒ„๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๋ฐ›์•„ ํšŒ์› ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

ํƒˆํ‡ด : ํด๋ผ์ด์–ธํŠธ๋Š” ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ž„์„ ํ™•์ธํ•œ ํ›„, ํƒˆํ‡ด ์š”์ฒญ์„ ์„œ๋ฒ„๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” POST ์š”์ฒญ์œผ๋กœ ํ•ด๋‹น ํšŒ์›์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์ •๋ณด์ˆ˜์ •.gif

๊ธ€์“ฐ๊ธฐ


ํด๋ผ์ด์–ธํŠธ๋Š” ์ œ๋ชฉ, ๋ณธ๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

form action="/add" method="post"

์„œ๋ฒ„๋Š” ๊ธ€ ์ž‘์„ฑํ•œ ํšŒ์›์ด ๋กœ๊ทธ์ธํ•œ ํšŒ์›์ด ๋งž๋‹ค๋ฉด ์ œ๋ชฉ, ๋‚ด์šฉ, ๊ธ€ ์ž‘์„ฑ ์‹œ๊ฐ„, ๋‹‰๋„ค์ž„์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์“ฐ๊ธฐ.gif

๊ธ€ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ


๊ธ€ ์ˆ˜์ • : ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์„ ์กฐํšŒํ•˜๊ณ  ์กฐํšŒ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์— ๋„ฃ๊ณ  ํฌ์›Œ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์ˆ˜์ •ํ•  ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•œ ํ›„ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ POST ์š”์ฒญ์„ ๋ณด๋‚ด ์ž‘์„ฑ์ž ํ™•์ธ ํ›„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ธ€ ์‚ญ์ œ : ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ์ž๊ฐ€ ๋งž๋Š” ์ง€ ํ™•์ธ ํ›„ POST ์š”์ฒญ์œผ๋กœ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

ํšŒ์›์ •๋ณด์ˆ˜์ • ๋ฐ ํƒˆํ‡ด.gif

๊ธ€ ๋ชฉ๋ก ์กฐํšŒ


์ž‘์„ฑ๋œ ๋ชจ๋“  ๊ธ€์„ ์กฐํšŒํ•˜์—ฌ ๋ชจ๋ธ์— ๋„ฃ๊ณ  JSP๋กœ ํฌ์›Œ๋“œํ•ฉ๋‹ˆ๋‹ค.

  • page : ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜„์žฌ ํŽ˜์ด์ง€, ๋งจ ์ฒ˜์Œ, ์ด์ „, ๋‹ค์Œ, ๋งจ ๋์„ ํ‘œ์‹œํ•˜์—ฌ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๋ชฉ๋ก ํŽ˜์ด์ง•.gif

๐ŸŽฏ ๊ฒฐ๊ณผ ๋ฐ ์„ฑ๊ณผ

  • Spring Security ๋ฐ OAuth2 : ์ธ์ฆ/์ธ๊ฐ€ ์‹œ์Šคํ…œ ๊ตฌํ˜„ ๊ฒฝํ—˜ ๋ฐ ์™ธ๋ถ€ API ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ณด์•ˆ์— ๋Œ€ํ•œ ์ง€์‹์„ ์Œ“์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ธฐํšŒ์˜€์Šต๋‹ˆ๋‹ค.
  • RESTful API ์„ค๊ณ„๋กœ ์ธํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ฃผ๊ณ  ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ JSP์™€ Spring Boot์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์ดํ•ด๋„๊ฐ€ ๊นŠ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
profile
๊ฐœ๋ฐœ์ž ์ค€๋น„์ƒ~

0๊ฐœ์˜ ๋Œ“๊ธ€