๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป develop

[spring] ์Šคํ”„๋ง์œผ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ

jcowwk 2024. 5. 7. 14:30

์Šคํ”„๋ง์œผ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ


์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค !

์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” :)

 

https://jcowwk.tistory.com/135

 

[spring] ์Šคํ”„๋ง์œผ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ, TIMESTAMP

์Šคํ”„๋ง์œผ๋กœ CRUD ๊ฒŒ์‹œํŒ ๋งŒ๋“ค๊ธฐ - ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ, TIMESTAMP ์Šคํ”„๋ง ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค ! ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” :) 1. ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ 2. TIMESTAMP https://jcowwk.tistory.com/133 [spring] ์Šคํ”„

jcowwk.tistory.com

 

๋ณธ ํฌ์ŠคํŒ…๊ณผ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

 

1. oauth2

2. ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ


1. oauth2

https://jcowwk.tistory.com/138

 

[security] ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ(์ฟ ํ‚ค, ์„ธ์…˜)๊ณผ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ(JWT, oauth2)

์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ(์ฟ ํ‚ค, ์„ธ์…˜)๊ณผ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ(JWT, oauth2) ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ ํ•˜๋ฉด์„œ ์ •๋ฆฌํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค ! ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” :) 1. ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ์ธ์ฆ, ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ 2. ์ฟ ํ‚ค 3. ์„ธ์…˜ 4. JWT 5

jcowwk.tistory.com

 

oauth2์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์œ„์˜ ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

2. ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ

https://notspoon.tistory.com/45

 

๊ตฌ๊ธ€๋กœ๊ทธ์ธ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ธฐ 1ํŽธ - Google Developers ์„ค์ •

๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ API ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ์ˆ˜๋งŽ์€ ์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ์•„์ด๋”” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ๋Š” ์‰ฝ์ง€ ์•Š๋‹ค. ๋˜ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ฆฌ์†Œ์Šค ์˜ค๋„ˆ ๋˜ํ•œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋‹ด๋œ๋‹ค.

notspoon.tistory.com

 

์œ„์˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ google developer์—์„œ oauth2 ๋“ฑ๋ก์„ ํ†ตํ•ด client-id, client-secret ์ •๋ณด๋ฅผ ๋ฐ›์•„์ค๋‹ˆ๋‹ค!

 

- ํ”„๋กœ์ ํŠธ ํŒŒ์ผ ๊ตฌ์กฐ

 

- build.gradle

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'

์œ„์˜ 2๊ฐ€์ง€ ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

- application-oauth.properties

๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” properties ์™ธ์— application-oauth.properties๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

properties์—๋Š” spring.profiles.include = oauth ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

spring.security.oauth2.client.registration.google.client-id=ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””
spring.security.oauth2.client.registration.google.client-secret=ํด๋ผ์ด์–ธํŠธ ๋น„๋ฐ€๋ฒˆํ˜ธ
spring.security.oauth2.client.registration.google.scope=๊ฐ€์ ธ์˜ฌ ํ•ญ๋ชฉ(profile, name,, etc)

์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

 

- SecurityConfig

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•ด์คฌ์œผ๋ฉด, ๋‹ค์Œ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •์„ ํ•ด๋ด…์‹œ๋‹ค!

 

์šฐ์„  ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ์•„์ง์€ ๋นจ๊ฐ„์ƒ‰ ์ค„์ด ์—ฌ๋Ÿฌ๊ฐœ ๋œจ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ‘์—์„œ ๋‹ค ์ถ”๊ฐ€๋ฅผ ํ•ด์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„˜์–ด๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

csrf.disable()๋Š” spring security๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฒ˜์Œ ๋œจ๋Š” ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ์—†์• ์ฃผ๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

authorizeRequests()์˜ ํ•จ์ˆ˜ ์•ˆ์— requestMatchers()๋Š” ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์— ๋”ฐ๋ผ ์‘๋‹ตํ•˜๋„๋ก ๊ถŒํ•œ ์„ค์ •ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ๋กœ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ๋•Œ ์›๋ž˜๋Š” ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ํ•ด์คฌ์ง€๋งŒ, .formLogin()์˜ .loginPage("/loginForm")์—์„œ ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด .loginProcessingUrl("/login")์„ ํ†ตํ•ด spring security์˜ login์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ๋Œ€์‹  ์ฒ˜๋ฆฌํ•ด์ค๋‹ˆ๋‹ค. .defaultSucessUrl("/")์œผ๋กœ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

 

.oauth2Login()์€ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

userInfoEndpoint()์˜ .userService()๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ์œ ์ € ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

 

- PrincipalOauth2UserService

oauth2 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ ์œ ์ € ์ •๋ณด์™€ ์•ก์„ธ์Šค ํ† ํฐ์„ OAuth2UserRequest์— ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋งŒ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

- User

์œ ์ € ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—”ํ„ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

- PrincipalDetails

์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ๋ˆŒ๋ €์„ ๋•Œ ์•„์ด๋””๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํšŒ์›๊ฐ€์ž…๊นŒ์ง€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํšŒ์›๊ฐ€์ž… ํ›„ ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ ์„ธ์…˜์ด๋‚˜ ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ ์œ„ํ•ด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

 

์•ž์˜ ํฌ์ŠคํŒ…์—์„œ ์„ธ์…˜์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ HttpSession ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ธ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์„ธ์…˜์ด ๋”ฐ๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์„ธ์…˜์€ Authentication ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , ๊ฐ์ฒด ์•ˆ์—๋Š” OAuth2User๊ณผ UserDetails ํƒ€์ž…๋งŒ ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OAuth2User๋Š” oauth ๋กœ๊ทธ์ธ, UserDetails๋Š” ์ผ๋ฐ˜ ์‹œํ๋ฆฌํ‹ฐ ๋กœ๊ทธ์ธ์„ ํ•  ๋•Œ ์œ ์ € ์ •๋ณด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

ํผ ๋กœ๊ทธ์ธ๊ณผ oauth๋กœ๊ทธ์ธ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ authentication ๊ฐ์ฒด์— ๋„ฃ๊ธฐ๋ณด๋‹จ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฐ๊ฐ์„ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•˜๋ฉด authentication ๊ฐ์ฒด์— PrincipalDetails ํƒ€์ž…์„ ๋„ฃ์–ด์„œ ํ›จ์”ฌ ๋” ๊ฐ„ํŽธํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ํ•œ ํ›„์— /user ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋กœ๊ทธ์ธ๋œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ ํ•œ ์‚ฌ์ดํŠธ

https://growth-coder.tistory.com/135

 

[Spring] ์Šคํ”„๋ง Oauth2 ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ๊ณผ jpa ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ € ์ •๋ณด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ (OAuth2 ์Šคํ”„๋ง 1ํŽธ

OAuth2 ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ํ•ด ๋ณผ ์˜ˆ์ •์ธ๋ฐ mysql ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ jpa๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•ด๋ณด๋ ค ํ•œ๋‹ค. ๋จผ์ € OAuth2์— ๋Œ€ํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž๋ฉด ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„ ๊ณผ์ •์˜ ๋ฒˆ

growth-coder.tistory.com

https://www.youtube.com/watch?v=GEv_hw0VOxE&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=1

 

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋งŒ๋‚˜์š” ~