์คํ๋ง์ผ๋ก CRUD ๊ฒ์ํ ๋ง๋ค๊ธฐ - ๊ตฌ๊ธ ๋ก๊ทธ์ธ
์คํ๋ง ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌํ ๋ด์ฉ ์ ๋๋ค !
์ค๋ฅ๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ :)
https://jcowwk.tistory.com/135
๋ณธ ํฌ์คํ ๊ณผ ์ด์ด์ง๋๋ค.
1. oauth2
2. ๊ตฌ๊ธ ๋ก๊ทธ์ธ
1. oauth2
https://jcowwk.tistory.com/138
oauth2์ ๋ํ ๋ด์ฉ์ ์์ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!
2. ๊ตฌ๊ธ ๋ก๊ทธ์ธ
https://notspoon.tistory.com/45
์์ ์ฌ์ดํธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ํ ๋ 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
https://www.youtube.com/watch?v=GEv_hw0VOxE&list=PL93mKxaRDidERCyMaobSLkvSPzYtIk0Ah&index=1
๋ค์ ํฌ์คํ ์์ ๋ง๋์ ~