ย ๋ด๊ฐ ๊ธฐ์ฌํ ๋ถ๋ถ
โข
OAuth2๋ฅผ ์ด์ฉํ์ฌ Google, Naver, Kakao, GitHub ์์
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํ
โข
๊ฐ ์๋น์ค๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์ด์ ๋ ์ ์๋๋ก ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ
์ฒ(MSA) ์ ์ฉ
โข
OpenWeatherMap API๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์์ ์์น ๊ธฐ๋ฐ ์ค์๊ฐ ๋ ์จ ์ ๋ณด๋ฅผ ํ๋ซํผ์ ๋์์ฃผ๋ ๊ธฐ๋ฅ์ ๊ตฌํ
โข
์ผ๊ด์ฑ๊ณผ ํ์
์ ํจ์จ์ฑ ๊ทธ๋ฆฌ๊ณ ์ถฉ๋๋ฐฉ์ง๋ฅผ ์ํด Git Flow์ ์ปค๋ฐ ์ปจ๋ฒค์
๋์
โข
ํ๋ก์ ํธ ๊ธฐ๊ฐ์ ์ฐจ์ง์ด ์๊ธฐ์ง ์๋๋ก ์๋น์ค ๊ธฐํ ๋ฐ ๋ฐฉํฅ์ฑ ์ค์ ๋ถ๋ถ์ ๋ํด ์ฃผ๋์ ์ผ๋ก ์งํ
ย ์ฌ์ฉ ๊ธฐ์
โข
DataBase
โฆ
MariaDB
โข
BackEnd
โฆ
Java / Spring Boot / Spring Data JPA / Spring Security / Spring Cloud / Selenium / Chrome Driver / Google Storage
โข
API
โฆ
Kakao Login / Google Login / GitHub Login / Naver Login / Swagger / OpenWeatherMap
โข
Software Architecture Pattern
โฆ
Microservices Architecture(MSA)
โข
FrontEnd
โฆ
HTML / CSS / JavaScript / Vue.js
โข
Collaboration
โฆ
GitHub / Slack / Notion / Figma / Miro
System Architecture
itAbility System Architecture
ํธ๋ฌ๋ธ ์ํ 1
๋ฌธ์ ๋ฐฐ๊ฒฝ
ํ๋ก์ ํธ์์ OAuth2 ์์
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ฉด์, ๋ค์ํ OAuth2 ์ ๊ณต์(Google, Kakao, GitHub, Naver)์์ ๋ฐํํ๋ ์ฌ์ฉ์ ์ ๋ณด์ ๊ตฌ์กฐ๊ฐ ์๋ก ๋ค๋ฅด๋ค๋ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์ผ๋ถ ์ ๊ณต์๋ ID๋ฅผ ์ซ์ ํํ๋ก ๋ฐํํ๋ ๋ฐ๋ฉด, ๋ค๋ฅธ ์ ๊ณต์๋ ๋ฌธ์์ด๋ก ๋ฐํํ์ต๋๋ค. ์ด๋ก ์ธํด ์ ๊ณต์๋ณ๋ก ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๊ณ ์ ์ฅํ๋ ๋ฐ ์ด๋ ค์์ด ๋ฐ์ํ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
1.
OAuth2Response ์ธํฐํ์ด์ค ๋์
: ๊ฐ ์ ๊ณต์๋ณ๋ก ๋ค๋ฅธ ๊ตฌ์กฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด OAuth2Response ์ธํฐํ์ด์ค๋ฅผ ๋์
ํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ณตํต์ ๋ฉ์๋(getProviderId(), getEmail() ๋ฑ)๋ฅผ ์ ์ํ๊ณ , ๊ฐ ์ ๊ณต์๋ณ๋ก ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ํต์ผ๋ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ํ์ต๋๋ค.
2.
ID ๋ณํ ์ ๋ต: ์ฌ์ฉ์ ID(Long)์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด MessageDigest๋ฅผ ์ฌ์ฉํ์ฌ SHA-512 ํด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ID๋ฅผ ๋ณํํ์ต๋๋ค. ํนํ, Naver(๋ฌธ์์ด)์ Google(๊ตฌ๊ธ์ ID๊ฐ์ด Long๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ์ต๋๋ค)๊ณผ ๊ฐ์ด ๋ฌธ์์ด ID๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํด์ํ์ฌ ์ซ์ ํํ๋ก ๋ณํํ๊ณ , ์์๋ก ๋ณํ๋ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํด ์์๋ก ๋ณํํ์ต๋๋ค.
3.
CustomOAuth2UserService ๊ตฌํ: ๊ฐ ์ ๊ณต์์์ ๋ฐํ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ณตํต์ ๊ตฌ์กฐ๋ก ๋งคํํ์ฌ UserDTO ๊ฐ์ฒด์ ์ ์ฅํ๊ณ , ์ด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก CustomOAuth2User ๊ฐ์ฒด๋ฅผ ์์ฑํ์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ
์ด ํธ๋ฌ๋ธ์ํ
๊ณผ์ ์ ํตํด ๋ค์ํ OAuth2 ์ ๊ณต์์์ ๋ฐํ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ ์ ์์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์์
๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ์์ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ด ํฌ๊ฒ ํฅ์๋์์ผ๋ฉฐ, ์ถํ GitHub ๋ก๊ทธ์ธ์ ๋์
ํ๋๋ฐ๋ ์ด๋ ค์์ด ์์ง ์์์ต๋๋ค.
ํด๋น ๊ฒฝํ์ ํตํด ์๊ฒ ๋ ์
์ด๋ฒ ๊ฒฝํ์ ํตํด OAuth2์ ๊ฐ์ ์ธ๋ถ ์ธ์ฆ ์์คํ
์ ๋ค๋ฃฐ ๋, ์ ๊ณต์๋ณ ๋ฐ์ดํฐ ํ์์ ์ฐจ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ดํดํ๊ณ ํตํฉํ ์ ์๋ ์ค๊ณ๊ฐ ํ์ํ๋ค๋ ์ ์ ๋ฐฐ์ ์ต๋๋ค. ํนํ, ์ด๋ฌํ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๋ฌธ์ ์ ์ง๋ฉดํ ์ ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋ง๋ จํ๋ ๊ฒ์ด ์ค์ํจ์ ๋๊ผ์ต๋๋ค. ์์ผ๋ก๋ ๋ณด๋ค ์ฒ ์ ํ ์ฌ์ ๋ถ์๊ณผ ๊ณํ์ ํตํด ์ด๋ฐ ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐฉ์งํ๊ณ , ๋์ฑ ์ ์ฐํ ๋์์ด ๊ฐ๋ฅํ๋๋ก ํด์ผ๊ฒ ๋ค ์๊ฐํ์ต๋๋ค.
ํธ๋ฌ๋ธ ์ํ 2
๋ฌธ์ ๋ฐฐ๊ฒฝ
ํ๋ก์ ํธ์์ MSA(Microservices Architecture) ์ํคํ
์ฒ๋ฅผ ๋์
ํ ์ดํ, Spring Gateway๋ฅผ ํตํด ํ๋ก ํธ์๋(Vue.js ๊ธฐ๋ฐ์ SPA)์ ๋ฐฑ์๋ ๊ฐ์ ํต์ ์ ์ฒ๋ฆฌํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๊ณผ์ ์์ CORS(Cross-Origin Resource Sharing) ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ฌธ์ ์ ์์ธ์ ์ด๋ ๊ฒํ๋ฉด ๋ ์ ๋์ํ๊ฒ ์ง ํ๋ ๋ง์์SecurityConfig ํด๋์ค์์์ CORS ์ค์ ๊ณผ application.yml ํ์ผ ๋ด์์์ CORS ์ค์ ์ด ์ค๋ณต๋์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด๋ฌํ ์ค๋ณต ์ค์ ์ ํต์ ์ด ์ฐจ๋จ๋๋ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผ ํ๋ก์ ํธ ์งํ์ ์์ด ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
CORS ์ค์ ์ฌ๊ตฌ์ฑ:
SecurityConfig ํด๋์ค ๋ด์์๋ง CORS ์ค์ ์ ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค. application.yml ํ์ผ ๋ด์ CORS ์ค์ ์ ์ ๊ฑฐํ๊ณ , Spring Gateway์์์ CORS ์ค์ ๋ง ์ฌ์ฉํ๋๋ก ์กฐ์ ํ์ต๋๋ค.
Spring Security์ CorsConfigurationSource๋ฅผ ํ์ฉํ์ฌ ํน์ ๋๋ฉ์ธ์์์ ์์ฒญ์ ํ์ฉํ๋๋ก ์ค์ ํ์์ผ๋ฉฐ, http.cors() ์ค์ ์ ํตํด ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ํต์ ์ ํ์ฉํ์ต๋๋ค.
๊ฐ์ ๊ฒฐ๊ณผ
CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ, ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ์ ํต์ ์ด ์ํํ๊ฒ ์ด๋ฃจ์ด์ก์ผ๋ฉฐ ํนํ, MSA ํ๊ฒฝ์์ ๋ฐ์ํ ์ ์๋ CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฝํ์ ํ๋ก์ ํธ์ ์์ ์ฑ์ ๋์ด๋ ๋ฐ ๊ธฐ์ฌํ์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋น์ค ๊ฐ์ ์ฐ๊ฒฐ์ฑ์ด ๊ฐ์ ๋์๊ณ , CORS ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒฝํ์ ํฅํ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ค์ํ ์ฐธ๊ณ ์๋ฃ๊ฐ ๋์์ต๋๋ค.
ํด๋น ๊ฒฝํ์ ํตํด ์๊ฒ ๋ ์
์ด๋ฒ ๊ฒฝํ์ ํตํด ํ๋ก์ ํธ ์งํ ์ ์ค์ ๊ฐ์ ์ถฉ๋์ ์๋ฐฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ๊นจ๋ฌ์์ต๋๋ค. ํนํ, MSA ํ๊ฒฝ์์๋ ์ค์ ์ด ์ผ๊ด๋๊ฒ ์ ์ฉ๋์ด์ผ ํ๋ฉฐ, ๋ถํ์ํ ์ค๋ณต ์ค์ ์ด ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ ์ ์๋ค๋ ์ ์ ๋ฐฐ์ ์ต๋๋ค. ์ด๋ฅผ ํตํด, ์ค์ ๊ด๋ฆฌ์ ์ค์์ฑ์ ์ฌ์ธ์ํ๊ณ , ์์คํ
์ ์ฒด์ ์์ ์ฑ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ์ต๋ํ์ต๋๋ค.
์ด๋ ค์์ ๊ทน๋ณตํ๊ณ ์
์คํ๋ง์ ์ด๋ ค์๊ณผ ์๋ฐ์ ์ด๋ ค์ ๋๋ฌธ์ ํด๋น ์ด์๋ฅผ ๊ทน๋ณตํ๊ณ ์ ํ์๋ผ๋ฆฌ ๊ธฐ์ด๋ถํฐ ๋ค์ง์ ์์ํ Java ์คํฐ๋๋ฅผ ์งํํ์์ต๋๋ค.
๐ซกย ํ๊ณ
โํค์ด ๋์ฌ ์ ์๋ ๋ฏธ๋ก ์์์ ๊ธธ์ ์ฐพ๋ ์ฌ์ "
ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ฉด์, ์ฌ๋ฌ ๋์ ์ ํตํด ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ต๋๋ค. ํนํ Vue.js๋ฅผ ์ฌ์ฉํ SPA ๊ตฌ์ถ์์ CORS ๋ฌธ์ ๋ ๊ฐ์ฅ ํฐ ๊ณผ์ ์ค ํ๋์์ต๋๋ค. Spring Gateway์์ ์ฐ๋ ๊ณผ์ ์์ ๋ฐ์ํ ํต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ง์ ์ค์ ์ ๋ฐ๋ณตํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ํํ ํต์ ์ ๊ตฌํํ ์ ์์์ต๋๋ค. ์ฒ์์๋ ๋ณต์กํ๊ณ ๋ํดํ๊ฒ ๋๊ปด์ก๋ ๋ฌธ์ ๋ค์ด ์๊ฐ์ด ์ง๋๋ฉด์ ์ ์ฐจ ์ดํด๋๊ณ , ํด๊ฒฐ๋๋ ๊ณผ์ ์ ํตํด ๊ธฐ์ ์ ์ผ๋ก๋ ๊ฐ์ธ์ ์ผ๋ก๋ ์ฑ์ฅํ ์ ์์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ ๋จ์ํ ๊ธฐ์ ์ ์ธ ์ฑ์ทจ๋ฟ๋ง ์๋๋ผ, ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ์ป๋ ์ฑ์ทจ๊ฐ๊ณผ ์์ ๊ฐ์ ๋ํด์ฃผ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝํ๋ค์ ์์ผ๋ก์ ํ๋ก์ ํธ์์๋ ์ ์๊ฒ ํฐ ๋์์ด ๋ ๊ฒ์
๋๋ค. ์๋ก์ด ๊ธฐ์ ๊ณผ ๊ฐ๋
์ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ด ๋น๋ก ์ด๋ ต๊ณ ํผ๋์ค๋ฌ์ธ ์ ์์ง๋ง, ๊ทธ ๊ณผ์ ์ ํตํด ์ฑ์ฅํ๋ ๊ฒ์ด ์ง์ ํ ๊ฐ์น๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ์ด ํ๋ก์ ํธ์์ ์ป์ ๊ธฐ์ ์ ์ญ๋๊ณผ ๊ตํ์ ์์ผ๋ก์ ๋์ ์์ ์ ๋ฅผ ๋ ๊ฐํ๊ฒ ๋ง๋ค์ด์ค ๊ฒ์ด๋ผ ๋ฏฟ์ต๋๋ค.