
๐ฉ๐ปโ๐ป Supabase๋ก OAuth Login์ ๊ตฌํํ๋ฉด์ Supabase์ OAuth ๊ณต๊ธ์ ๊ฐ ํต์ ๊ณผ, OAuth Login ๊ณผ์ ์ ๋ํด ์ดํดํ๊ธฐ ์ํด ๊ณต๋ถํ ๋ด์ฉ์ ๋๋ค. ์ค์ ๊ณผ ๊ด๋ จ๋ ๊ฒ์๊ธ์ ์๋๋ก ์ด๋ํด ์ฃผ์ธ์.
์์ฆ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์๊ฐ์ ์ ์๊ตฌํ๊ธฐ๋ ํ์ง๋ง, ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ๋ค๋ฅธ ์ฌ์ดํธ์ ๊ณ์ ์ ํตํด ๊ฐํธํ๊ฒ ๊ฐ์ ํ๊ฑฐ๋ ๋ก๊ทธ์ธํ ์ ์๋ ๋ฐฉ์๋ ํจ๊ป ์ ๊ณตํฉ๋๋ค. ๋งค๋ฒ ์ด๋ฆ์ด๋ ์ด๋ฉ์ผ ๊ฐ์ ์ ๋ณด๋ฅผ ํ๋ํ๋ ์ ๋ ฅํ์ง ์์๋ ๋๊ณ , ํด๋ฆญ ํ ๋ฒ์ผ๋ก ๋๋๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํธ๋ฆฌํ์ฃ .
์ด๋ ๊ฒ ํ ์ฌ์ดํธ์ ๊ณ์ ์ผ๋ก ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด OAuth์ ๋๋ค. OAuth๋ ๋ค๋ฅธ ์๋น์ค๊ฐ ๋ด ๊ณ์ ์ ๋ณด์ ์์ ํ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋๋ค.
์๋ฅผ ๋ค์ด, โ๊ตฌ๊ธ๋ก ๋ก๊ทธ์ธํ๊ธฐโ ๋ฒํผ์ ํด๋ฆญํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์ ๊ตฌ๊ธ ๊ณ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ชฐ๋ผ๋, ๊ตฌ๊ธ์์ ์ธ์ฆ๋ ์ ๋ณด๋ฅผ ๋ฐ์์ ์์ ํ๊ฒ ๋ก๊ทธ์ธ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ์ ์ฅ์์๋ ํธ๋ฆฌํจ์, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ํธ์์ฑ์ ๋์ด๊ธฐ ์ํด, ํ๋ก์ ํธ์์ OAuth ์ธ์ฆ ๋ฐฉ์์ ๊ตฌํํ๋ฉด์ OAuth 2.0์ ์ธ์ฆ ๊ณผ์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ Supabase ๊ฐ์ ํ๋ซํผ์์ OAuth๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง๋ฅผ ์์๋ณด์์ต๋๋ค.
์์ผ๋ก ์ค๋ช ํ supabase์ ์ธ์ฆ ํ๋ฆ์์ ์ฐ์ด๋ ๋ฐฉ์๊ณผ ์ธ์ฆ ์ ์๋ฒ ๊ฐ ํต์ ์ ์ฐ์ด๋ ๋ค์ํ ๊ฐ๋ ๋ค์ ๋ํด ๋จผ์ ์์๋ณด๊ฒ ์ต๋๋ค.
OAuth 2.0์์๋ ์ฃผ๋ก Authorization Code Grant์ Implicit Grant๏ผ ๋ ๊ฐ์ง ๋ฐฉ์์ด ์ฌ์ฉ๋ฉ๋๋ค.
Supabase OAuth๋ ๊ทธ ์ค Authorization Code Grant๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. OAuth 2.0์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ธ์ฆ ํ๋ฆ ์ค ํ๋๋ก, ๋ณด์์ฑ์ด ๋ฐ์ด๋๊ณ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์๋ฒ ๊ฐ์ ํต์ ์ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ์๊ฒฉ ์ฆ๋ช ์ ๋ค๋ฃจ์ง ์๊ณ , ์ธ์ฆ ์ฝ๋(Authorization Code)๋ฅผ ํตํด ๋ณด์์ ์ ์งํ๋ฉฐ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ต๋๋ค.
์ก์ธ์ค ํ ํฐ์ ์๋ฒ์์ ์ฒ๋ฆฌํด ์๊ฒฉ ์ฆ๋ช ์ด ๋ ธ์ถ๋ ์ํ์ด ์ค์ด๋ค๊ณ , ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ ์ธก์ ๋ ธ์ถํ์ง ์๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค. ์ฆ, ์๋ฒ๊ฐ ํ ํฐ์ ์ฒ๋ฆฌํ๊ณ ๋ณด๊ดํ๋ ๊ตฌ์กฐ๋ก ํด๋ผ์ด์ธํธ ์ธก์ ๋ณด์ ์ํ์ด ์ค์ด๋ญ๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ ํตํด ์ก์ธ์ค ํ ํฐ ๋ง๋ฃ์์ ์ฌ์ฉ์๋ ๋ค์ ๋ก๊ทธ์ธํ ํ์ ์์ด ์๋กญ๊ฒ ํ ํฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
BUT, ๋ค๋ฅธ OAuth ํ๋ฆ์ ๋นํด ๋น๊ต์ ๋ณต์กํฉ๋๋ค. Redirect URI, Client Secret๋ฑ ์ค์ ์ด ํ์ํ๊ณ ์๋ฒ๊ฐ ๋ฐ๋์ ํ์ํฉ๋๋ค.
๐
Implicit Grant
ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐ๋ก ์ก์ธ์ค ํ ํฐ์ ๋ฐ๋ ๋ฐฉ์์ ๋๋ค. ๋ชจ๋ ์ธ์ฆ ์ ์ฐจ๊ฐ ํด๋ผ์ด์ธํธ ์ธก์์ ์ด๋ฃจ์ด์ง๋ฉฐ ์๋ฒ์์ ๊ถํ ์ฝ๋๋ฅผ ๊ตํํ๋ ๊ณผ์ ์ด ์๋ต๋ฉ๋๋ค.
์๋ฒ๋ฅผ ๊ฑฐ์น์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ๊ฒฝํ์ด ๋น ๋ฅด๊ณ ๊ฐํธํ ๋์ ํด๋ผ์ด์ธํธ ์ธก์์ ํ ํฐ์ ์ง์ ์ทจ๊ธํ์ฌ ์๋์ ์ผ๋ก ๋ณด์ ์์ค์ด ๋ฎ์ต๋๋ค.
๐๐ป ๋ณด์ ๋ฌธ์ ๋ก ์ธํด OAuth 2.0 ์ต์ ๊ถ๊ณ ์์๋ Implicit Grant ์ฌ์ฉ์ ์ง์ํฉ๋๋ค.
- ํ ํฐ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ๋ธ๋ผ์ฐ์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ํ์ทจ ์ํ์ด ํฌ๊ณ , ์ ์์ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์ ์์ต๋๋ค.
- URL์ ํด์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋์ด ๋ ธ์ถ๋๋ ์ก์ธ์ค ํ ํฐ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ก์๋ ๋จ์ง ์์ง๋ง, ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ์ทจ๋ ์ํ์ด ์์ด ํด๋ผ์ด์ธํธ ์ธก์์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ฐ๋ก ๋ฐ๊ธํ์ง ์์, ์ก์ธ์ค ํ ํฐ ๋ง๋ฃ์์ ์ฌ์ฉ์๊ฐ ๋ค์ ๋ก๊ทธ์ธ์ ํด์ผํฉ๋๋ค. ์ด๋ ํ ํฌ ๊ฐฑ์ ์ ์ํ ์ถ๊ฐ์ ์ธ ๋ณด์ ์ ์ฐจ๊ฐ ์์ด ๋ณด์ ์์ค์ด ๋ฎ์ต๋๋ค.
- ์ฃผ๋ก ์๋ฒ๊ฐ ์๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
ํน์ง Authorization Code Grant Implicit Grant ๋ณด์์ฑ ๋์(์๋ฒ๊ฐ ํ ํฐ์ ์ฒ๋ฆฌ) ๋ฎ์(ํด๋ผ์ด์ธํธ๊ฐ ํ ํฐ์ ์ฒ๋ฆฌ) ์๋ฒ ํ์ ์ฌ๋ถ ํ์ ๋ถํ์ ์ก์ธ์ค ํ ํฐ ํ๋ ๋ฐฉ์ ๊ถํ ์ฝ๋๋ฅผ ๋ฐ์ ํ, ์๋ฒ์์ ๊ตํ ํด๋ผ์ด์ธํธ๊ฐ ๊ณง๋ฐ๋ก ๋ฐ์ ๋ฆฌํ๋ ์ ํ ํฐ ์ง์ํ๋ฏ๋ก ์ก์ธ์ค ํ ํฐ ๋ง๋ฃ์ ๊ฐฑ์ ๊ฐ๋ฅ ๋ฏธ์ง์ ์ฌ์ฉ์ฌ๋ก ์๋ฒ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ SPA, ๋ชจ๋ฐ์ผ ์ฑ, ์๋ฒ์๋ ํด๋ผ์ด์ธํธ ํ ํฐ ๋ณด์ ์๋ฒ์์ ์ฒ๋ฆฌํ๋ฏ๋ก ๋ณด์์์ค์ด ๋์ URL ํด์์ ๋ ธ์ถ๋๋ฉฐ, ํด๋ผ์ด์ธํธ๊ฐ ๊ด๋ฆฌ OAuth 2.0 ๊ถ๊ณ ์ฌํญ ๊ถ์ฅ ์ง์
ํด๋ผ์ด์ธํธ์ OAuth ์๋ฒ ๊ฐ์ ํต์ ๊ฒฝ๋ก๋ก, OAuth ์ ๊ณต์(google, kakao ๋ฑ)๊ฐ ๋ก๊ทธ์ธ ์ฑ๊ณต ํ, ์ธ์ฆ ์ฝ๋๋ฅผ ๋ณด๋ผ URI์ ๋๋ค. ์ฆ, ์ธ์ฆ ํ OAuth ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋์์ฌ ๋ ์ฌ์ฉํฉ๋๋ค.
๋ฐ๋ผ์, supabase์ OAuth ๊ณต๊ธ์์ ๋์ผํ๊ฒ ์ค์ ๋์ด ์์ด์ผ ํฉ๋๋ค. ๋ง์ฝ, OAuth ๊ณต๊ธ์ ์ค์ ์ Redirect URI์ Supabase์ ์ค์ ์ด ์ผ์นํ์ง ์์ผ๋ฉด, OAuth๊ณผ์ ์ด ์ค๋จ๋ฉ๋๋ค.
OAuth ์ ๊ณต์๋ ์ธ์ฆ ๊ฒฐ๊ณผ(์ธ์ฆ ์ฝ๋)๋ฅผ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ค์ ์ ์กํด์ผ ํ๋๋ฐ, ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ Redirect URI๋ก๋ง ์ธ์ฆ์ฝ๋๋ฅผ ์ ์กํจ์ผ๋ก์จ OAuth ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค. ์์ ํ ํต๋ก์ญํ ์ ํจ์ผ๋ก์จ, ๋ฑ๋ก๋์ง ์์ URI๋ก redirect ์์ฒญ์ ํ๋ฉด ์ธ์ฆ์ ๊ฑฐ๋ถํจ์ผ๋ก์จ ์ ์์ ์ธ ์ธ์ฆ ํ์ทจ ๋ฐ ์ ๋ณด ์ ์ถ์ ๋ฐฉ์งํฉ๋๋ค.
OAuth 2.0 ๋ณด์ ์์น ์ค ํ๋์ธ '์ธ์ฆ ๊ณผ์ ์์ ๊ถํ ์ฝ๋๋ ์ก์ธ์ค ํ ํฐ์ด ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ์ ๋ขฐํ ์ ์๋ ๊ฒฝ๋ก๋ก๋ง ์ ๋ฌ๋์ด์ผ ํ๋ค'๋ฅผ ์งํต๋๋ค.
์๋ฒ ๊ฐ ํต์ ์์ OAuth ์ ๊ณต์๊ฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ณํ๊ณ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉํ๋ ์๊ฒฉ ์ฆ๋ช ์ ๋๋ค.
์๋ฒ ๊ฐ ํต์ ์์๋ง ์ฌ์ฉ๋๋ฉฐ, ํด๋ผ์ด์ธํธ ์ธก์์ ๋ ธ์ถ๋์ด์ ์๋ฉ๋๋ค. ๋ณด๊ดํ ๋๋ ํ๊ฒฝ๋ณ์ ๋ฑ์ ์์ ํ ๋ฐฉ์์ ์ฌ์ฉํด ๋ณด๊ดํด์ผ ํฉ๋๋ค. ๋ ธ์ถ ์ ๊ณต๊ฒฉ์๊ฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ฐ์ฅํ์ฌ OAuth ์ ๊ณต์๋ก๋ถํฐ ์ก์ธ์ค ํ ํฐ์ ์์ฒญํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ์ก์์๋ ๋ฐ๋์ HTTPS๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๐
Implicit Grant ํ๋ฆ์์๋, ๋ธ๋ผ์ฐ์ ์์ ์ง์ Access Token์ ์์ฒญํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ Client Secret์ด ๋ ธ์ถ๋ ์ํ์ด ์์ด ์ฌ์ฉ๋์ง ์์ต๋๋ค.
Client ID๋ OAuth ์ ๊ณต์๊ฐ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ณ ์ ํ ์๋ณ์๋ก ์ฝ๊ฒ ๋งํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ID์ ํด๋นํฉ๋๋ค.
OAuth ์ ๊ณต์๋ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ธํ๊ธฐ ์ํด ์ด ID๋ฅผ ๋ฐ๊ธํฉ๋๋ค. ์ธ์ฆ ์์ฒญ์ ํ๋ผ๋ฏธํฐ์ ํ์๋ก ํฌํจ๋์ด, ์ธ์ฆ์ ๋ณด๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ง ํ์ ํ๊ณ , ๋ฑ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์ง ํ์ธํฉ๋๋ค.
Client ID๋ง์ผ๋ก๋ ๊ณต๊ฒฉ์๊ฐ ์ฝ๊ฒ ํด๋ผ์ด์ธํธ๋ก ์์ฅํ ์ ์์ด ์์ฒญ์ ์์ ํ ์ ๋ขฐํ ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฑ ์์ ํ๊ฒ ์ธ์ฆํ๊ธฐ ์ํด OAuth ์ ๊ณต์๊ฐ ๋ฐ๊ธํ๋ ๋น๋ฐ ํค์ ๋๋ค.
์ก์ธ์ค ํ ํฐ์ ์์ฒญํ ๋ Client ID์ ํจ๊ป ๋ณด๋ด์ด ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฆ๋ช ํ๋ ๋ฐ ์ฐ์ ๋๋ค. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์๋ก Access Token์ ์์ฒญํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
Supabase๋ Access Token๊ณผ Refresh Token์ ์๋์ผ๋ก ์ฒ๋ฆฌํด ์ฌ์ฉ์๊ฐ ๋ณต์กํ ํ ํฐ ๊ด๋ฆฌ ์์ ์ ํ์ง ์๋๋ก ๋์์ค๋๋ค. ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ๊ณ , ํ ํฐ์ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณดํธ๋ API๋ก๋ถํฐ ์ ๊ทผ ํ ์ ์๋๋ก ๊ถํ์ ๋ถ์ฌํ๋ ๋จ๊ธฐ ์ ํจ ํ ํฐ์ ๋๋ค. ๋ณดํต ๋ช ๋ถ์์ ๋ช ์๊ฐ ์ ๋๋ก ์ ํจ๊ธฐ๊ฐ์ด ์งง์ต๋๋ค.
API ์์ฒญ์ ๋ณด๋ผ ๋ ์ด ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ๊ถํ์ ์ธ์ฆํฉ๋๋ค. supabase๋ ์์ฒญ์ ์ก์ธ์ค ํ ํฐ์ ์๋์ผ๋ก ํฌํจ์ํต๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋์์ ๋, ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํ ์ฅ๊ธฐ ์ ํจ ํ ํฐ์ ๋๋ค. ์ ํจ๊ธฐ๊ฐ์ด ๊ธธ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ฌ๋ก๊ทธ์ธํ์ง ์๊ณ ๋ ์ธ์ฆ์ ์ ์งํ ์ ์๊ฒ ํฉ๋๋ค.
๋ณดํต ํด๋ผ์ด์ธํธ ์ธก์ ์ ์ฅ๋๋ฉฐ,*Supabase๊ฐ ์๋์ผ๋ก ํ ํฐ์ ๊ฐฑ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์ฒญ์ด ์ธ๋ถ์์ ๋ณ์กฐ๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์์ ํ ์ธ์ฆ ๊ณผ์ ์ ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ์์์ ๊ฐ์ ๋๋ค.
Supabase๋ ๋ด๋ถ์ ์ผ๋ก ์ํธํ๋ ๋ฐฉ์์ผ๋ก State ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ ์์ฑํ์ฌ OAuth ์ ๊ณต์์๊ฒ ํจ๊ป ์ ์กํฉ๋๋ค. ๊ฐ๋ฐ์๋ ์ง์ ์ ์ผ๋ก State ๊ฐ์ ์์ฑํ๊ฑฐ๋ ๊ฒ์ฆํ ํ์ ์์ด ๋ถ๋ด์ด ์ ์ต๋๋ค.
State ๊ฐ์ ๊ณ ์ ํ๋ฉฐ ๊ฐ OAuth ์์ฒญ์ ๋ํด ์๋ก์ด ๊ฐ์ ์์ฑํ์ฌ ์์ฒญ์ด ๋์ค์ ๋ณ์กฐ๋๊ฑฐ๋ ๊ฐ๋ก์ฑ์ง ๊ฐ๋ฅ์ฑ์ ์ฐจ๋จํด ๋ณด์ ์ํ์ ์ต์ํํฉ๋๋ค. ๋ ์ธ์ฆ ๊ณผ์ ์ค ํด๋ผ์ด์ธํธ๋ ์ฌ๋ฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ, ๊ฐ์ ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ๋ฒ ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๋๋ผ๋ ๊ฐ ์์ฒญ์ ๊ณ ์ ํ State๊ฐ์ ๊ฐ์ ธ ์ด๋ค ์์ฒญ์ ๋ํ ์๋ต์ธ์ง ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
OAuth ์ ๊ณต์๊ฐ ๋ฆฌ๋๋ ์ ์์ฒญ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ค์ ๋ณด๋ผ ๋ ํฌํจ๋ฉ๋๋ค. supabase๋ ๋ฐํํ State ๊ฐ์ ๋ด๋ถ์ ์ผ๋ก ํ์ธํ์ฌ ์์ฒญ์ด ๋ณ์กฐ๋์ง ์์๋ ์ง ๊ฒ์ฆํฉ๋๋ค. ์ด ๊ณผ์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌ๋์ด ๋ณด์ ์์ ์ค์๋ฅผ ์๋ฐฉํฉ๋๋ค.
ํนํ State ํ๋ผ๋ฏธํฐ๋ ๊ณต๊ฒฉ์๊ฐ OAuth ์ธ์ฆ ํ๋ฆ์ ๊ฐ๋ก์ฑ์ ์ ์์ ์ธ ์์ฒญ์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด๋ CSRF ๊ณต๊ฒฉ๏ผ์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค์ํ ๋ณด์์์์ ๋๋ค. State ๊ฐ์ ํตํด OAuth ์ ๊ณต์๊ฐ ์ ์กํ๋ ๋ฆฌ๋๋ ์ ์ด ์ ๋ขฐํ ์ ์๋ ์ถ์ฒ์์ ์จ ๊ฒ์์ ํ์ธํด ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๐ CSRF(Cross-Site Request Forgery) ๊ณต๊ฒฉ
์ธ์ฆ๋ ์ฌ์ฉ์ ๊ถํ์ ์ ์ฉํด ์ฌ์ฉ์๊ฐ ์๋ํ์ง ์์ ์์ฒญ์ ์๋ฒ๋ก ๋ณด๋ด๋ ๊ณต๊ฒฉ์ ๋๋ค. ์ฆ, ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ด์ฉํด ์ฌ์ฉ์๊ฐ ์ธ์งํ์ง ๋ชปํ ์ํ์์ ๋ค๋ฅธ ์น์ฌ์ดํธ์์ ์ฌ์ฉ์ ๊ถํ์ผ๋ก ์๋ฒ์ ์ธ์ฆ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก๊ทธ์ธ๋ ์ํ์์ ์์ฒญ์ ๋ณด๋ผ ๋ ์๋์ผ๋ก ํด๋น ๋๋ฉ์ธ์ ์ฟ ํค๋ฅผ ํจ๊ป ์ ์กํ์ฌ ์ธ์ฆ์ ํ๋ ๊ธฐ๋ฅ์ ์ ์ฉํ๋ ๊ฒ์ ๋๋ค.
- ์ฌ์ฉ์์ ์ค์ํ ๋ฐ์ดํฐ(๊ณ์ข ์ด์ฒด, ์ฌ์ฉ์ ์ ๋ณด ๋ฑ)๋ฅผ ๊ณต๊ฒฉ์๊ฐ ๋ง์๋๋ก ๋ฐ๊ฟ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์๋ ์์ฒญ ์ฌ์ค์ ์ธ์งํ์ง ๋ชปํ๋ฏ๋ก, ๊ณต๊ฒฉ์ ์์์ฐจ๋ฆฌ๊ธฐ ํ๋ญ๋๋ค.
๋ฐฉ์ด๋ฐฉ๋ฒ
์๋ฒ ์ธก์์ ์์ฒญ์ด ์ง์ง ์ฌ์ฉ์๋ก๋ถํฐ ์จ ๊ฒ์ธ์ง ํ์ธํ๋ ์ ์ฐจ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐฉ์ดํ ์ ์์ต๋๋ค.
- CSRF ํ ํฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ๋๋ค. CSRF ํ ํฐ์ ์๋ฒ์์ ์์ฑํ ๊ณ ์ ์ ๋์๋ก, ์์ฒญ๋ง๋ค ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ๋ค์ ์๋ฒ๋ก ์ ์กํจ์ผ๋ก์จ ํ์ธํ๋ ๋ฐฉ์์ ๋๋ค.
- ์๋ฒ๋ ์์ฒญ์ Referer ํค๋์ ์ถ์ฒ๋ฅผ ํ์ธํ๊ณ , ์ฌ๋ฐ๋ฅธ ์ถ์ฒ์ธ ๊ฒฝ์ฐ์๋ง ์๋ตํ๊ณ , ๋ค๋ฅธ ์ถ์ฒ๋ผ๋ฉด ์ฐจ๋จํ ์ ์์ต๋๋ค. ํ์ง๋ง, ๋ธ๋ผ์ฐ์ ์ค์ ์ด๋ ํ๋ก์๋ก Referer ํค๋๊ฐ ์ ๊ฑฐ๋ ์ ์์ด ์ ๋ขฐ๋๊ฐ ๋ฎ์ ์ ์์ต๋๋ค.
- SamSite ์ฟ ํค ์์ฑ์ ์ค์ ํด ์์ฒญ์ด ๋์ผํ ์ฌ์ดํธ์์ ๋ฐ์ํ ๊ฒฝ์ฐ์๋ง ์ฟ ํค๋ฅผ ์ ์กํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์ธ๋ถ ์น์ฌ์ดํธ์์ ๋ฐ์ํ ์์ฒญ์๋์ฟ ๊ธฐ๊ฐ ์๋์ผ๋ก ์ ์ก๋์ง ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
Set-Cookie: sessionid=xyz; SameSite=Strict

๋ณธ๊ฒฉ์ ์ผ๋ก supabase์์ OAuth๋ฅผ ์ฌ์ฉํด ๋ก๊ทธ์ธํ ๋ ์ฒ๋ฆฌ๋๋ ๊ณผ์ ์ ์์๋ด
๋๋ค. (์์๋ Kakao OAuth ์ธ์ฆ์ผ๋ก ํ์์ต๋๋ค.)

์ฌ์ฉ์๊ฐ OAuth ์ ๊ณต์๋ก ๋ก๊ทธ์ธํ ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ client_id, redirect_url, response_type=code(์ธ์ฆ ์ฝ๋ ์์ฒญ), scope(์์ฒญ ๊ถํ ๋ฒ์), state๋ฅผ ํฌํจํ์ฌ OAuth ์ธ์ฆ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ ๋๋ค.
https://kauth.kakao.com/oauth/authorize?
response_type=code&
client_id={CLIENT_ID}&
redirect_uri=https://{application address}/callback&
scope=profile,email
๐๐ป Kakao OAuth๋ฅผ ์์ฒญํ ๋์ ์๋ฒ ํต์ ๋ชจ์ต์ ๋ณด๋ฉด ํต์ ์ ํ๋ OAuth ์ ๊ณต์ ์๋ฒ๋ฅผ ํ์ธํ ์ ์๊ณ , client_id, redirect_uri, response_type=code, scope, state์ ๊ฐ์ ์ ๋ณด๋ฅผ ํจ๊ป ๋ณด๋ด๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.

OAuth 2.0์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ๋๋ฌธ์ HTTPS๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ก์ธ์ค ํ ํฐ์ด๋ ์ธ์ฆ ์ฝ๋๊ฐ ๊ณต๊ฒฉ์์๊ฒ ๋ ธ์ถ๋ ์ํ์ด ์์ต๋๋ค.
redirect_uri๋ ์ฌ์ ๋ฑ๋ก๋ URI์ฌ์ผ ํฉ๋๋ค.
State ๊ฐ(eyJhb~)์ ์๋์ผ๋ก supabase๊ฐ ์์๋ก ์์ฑํ์ฌ ํฌํจ์ํต๋๋ค.

์ ํ๋ฆฌ์ผ์ด์ ์ OAuth ์ ๊ณต์์๊ฒ ์ฌ์ฉ์๊ฐ ์ธ์ฆ ํ์ด์ง๋ก ์ด๋ํ๋๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค.

์ฌ์ฉ์๊ฐ OAuth ์ ๊ณต์์์ ์ธ์ฆ์ ์๋ฃํ๋ฉด, OAuth ์๋ฒ๋ ์ธ์ฆ ์ฝ๋(Authorization Code)์ ์ด๊ธฐ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณด๋๋ state ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํด ๋ฑ๋ก๋ Redirect URI๋ก ๋ฆฌ๋๋ ์ ํฉ๋๋ค.
https://{application address}/callback?code={AUTHORIZATION_CODE}&state={STATE_VALUE}

์ ํ๋ฆฌ์ผ์ด์
์ ๋ฆฌ๋๋ ์
๋ URI์์ ๋ฐ์ state๊ฐ์ ์ฒ์ ์์ฑํ ๊ฐ๊ณผ ๋น๊ต ๊ฒ์ฆํด CSRF ๊ณต๊ฒฉ๊ณผ ๋ณ์กฐ๋ ์์ฒญ์ ๋ฐฉ์งํฉ๋๋ค. (STEP 1์ ์์ ์ฌ์ง์ state์ ๊ฐ์ ๊ฐ์ผ๋ก eyJhb~์ผ๋ก ์์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.)
์ธ์ฆ ์๋ฒ๊ฐ ๋ฐ๊ธํ ์ธ์ฆ ์ฝ๋๋ ์ผํ์ฉ์ด๋ฉฐ, ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ง๋ฃ๋ฉ๋๋ค.

POST /token
Host: oauth.provider.com
Content-Type: application/x-www-form-urlencoded
------------------------------
grant_type=authorization_code&
code={AUTHORIZATION_CODE}&
redirect_uri=https://{application address}/callback&
client_id={CLIENT_ID}&
client_secret={CLIENT_SECRET}
์์ฒญ์ Redirect URI๋ฅผ ํจ๊ป ์ ๋ฌํด, OAuth ์๋ฒ๊ฐ ์ต์ด์ ์ฌ์ฉํ URI์ ์ผ์นํ๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ ๋์ผํ์ง ์์ผ๋ฉด ์์ฒญ์ ๊ฑฐ๋ถํจ์ผ๋ก์จ ๊ถํ ์ฝ๋ ๋จ์ฉ์ ๋ฐฉ์งํฉ๋๋ค.
ํ ํฐ ์์ฒญ ์์๋ Client_id์ Client_secret์ด ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด OAuth ์ ๊ณต์์๊ฒ ์ ๋ขฐํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฆ๋ช ํ๊ณ , ๋ฑ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ธํ๋๋ก ํฉ๋๋ค.

OAuth ์ ๊ณต์๋ ์์ฒญ์ ๊ฒ์ฆํ๊ณ , ์ ํจํ๋ค๋ฉด ์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ฐ๊ธํฉ๋๋ค.

expires_at์ ํ ํฐ์ ๋ฐ๊ธ ์ผ์์
๋๋ค. expires_in์ ์ก์ธ์ค ํ ํฐ์ ์ ํจ ์๊ฐ์
๋๋ค.
์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉ์์ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๊ณ , ๋ฆฌํ๋ ์ ํ ํฐ์ ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋์์ ๋ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.

์๋ฒ(supabase)๋ ๋ฐ์ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค. OAuth ์ ๊ณต์(kakao)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ ํ๋ฆฌ์ผ์ด์ (client)์ ์ ๋ฌํด ์ธ์ฆ๋ ์ธ์ ์ ๊ด๋ฆฌํฉ๋๋ค.
Supabase๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ํ, ํด๋น ์ฌ์ฉ์์ ์ก์ธ์ค ํ ํฐ์ ๋ฐ์ ์๋์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. ์ฌ์ฉ์๋ ํ ํฐ์ ์ ํจ์ฑ์ด๋ ๋ง๋ฃ์ ๋ํด ์ ๊ฒฝ ์ธ ํ์๊ฐ ์์ผ๋ฉฐ, ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณ๋๋ก ์ฒ๋ฆฌํ ํ์๊ฐ ์์ต๋๋ค.
ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ์์ ํ๊ฒ ์ ์ฅํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํนํ ์ก์ธ์ค ํ ํฐ์ ํด๋ผ์ด์ธํธ์์ API ํธ์ถ ์ ์ฌ์ฉ๋๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ธก์์ ์ ์ฅ ๋ฐฉ์์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์๋ชป๋ ์ ์ฅ ๋ฐฉ์์ ํ ํฐ ํ์ทจ๋ก ์ด๋ฃจ์ด์ง ์ ์๊ณ , ํ ํฐ์ด ์ ์ถ๋๋ฉด ์ 3์๊ฐ ์ฌ์ฉ์์ ์์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ ์์ ํ ์ ์ฅ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒฝ์ฐ, ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํด ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์์ฒญํ ์ ์์ต๋๋ค. ์ด ๋, ๊ถํ ๋ฒ์(scope)๋ฅผ ์ต์ํ์ผ๋ก ์ค์ ํ์ฌ ํ์ํ ๊ถํ๋ง ์์ฒญํด์ผ ํฉ๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ด ๋ง๋ฃ๋๊ฑฐ๋ ๋คํธ์ํฌ ์ค๋ฅ๋ก ๊ฐฑ์ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ, Supabase๋ ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์์ ์ฒ๋ฆฌํ๊ณ , ์ฌ๋ก๊ทธ์ธ์ ์ ๋ํ ์ ์์ต๋๋ค.
OAuth ํ ํฐ์ ์ฃผ๊ณ ๋ฐ์ ๋๋ ๋ฐ๋์ HTTPS๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ ์์์ ํ ํฐ์ด ๋ ธ์ถ๋์ง ์๋๋ก ํฉ๋๋ค.
์ก์ธ์ค ํ ํฐ์ ๋ณดํต ์งง์ ์ ํจ ๊ธฐ๊ฐ์ ๊ฐ์ง๋ฉฐ, ๋ง๋ฃ๋ ํ์๋ ๋ ์ด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด, ์ฌ์ฉ์๊ฐ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค ํ ๋ 401 Unauthorized ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Supabase๋ ์ด๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ง๋ฃ๋๋ฉด ์๋์ผ๋ก ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํด ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ต๋๋ค.
์ด ์๋ํ๋ ๊ณผ์ ์์, Supabase๊ฐ ํ ํฐ ๋ง๋ฃ ์๊ฐ์ด ๋ค๊ฐ์ค๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ฌ์ธ์ฆ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ์๋๋๋ค.
์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋ ํ, API ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์ค์ ์ก์ธ์ค ํ ํฐ์ด ๋ง๋ฃ๋ ๊ฒ์ ๊ฐ์งํ๋ฉด, ๋ฆฌํ๋ ์ ํ ํฐ์ ์ฌ์ฉํด OAuth ์ ๊ณต์์๊ฒ ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ์์ฒญํ๊ณ ์๋กญ๊ฒ ๋ฐ๊ธ๋ฐ์ ์ฌ์ฉ์ ์ธ์ ์ ๊ฐฑ์ ํด ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ ์ฅ๊ธฐ์ ์ผ๋ก ์ ํจํ์ง๋ง, ์ผ์ ์๊ฐ์ด ์ง๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ๊ฑฐ๋ ๋ณด์์์ ์ด์ ๋ก ๋ง๋ฃ๋ ์ ์์ต๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด ์๋ก์ด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์๋ ๋ก๊ทธ์์ ์ํ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฆฌํ๋ ์ ํ ํฐ์ด ๋ง๋ฃ๋ ์ํ์์๋ ์ธ์ ์ ๋ณต๊ตฌํ ์ ์๊ธฐ ๋๋ฌธ์, ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ํ์ฌ ๋ค์ ๋ก๊ทธ์ธํ๋๋ก ํด์ผ ํฉ๋๋ค.
๋ง์ฝ Access Token๊ณผ Refresh Token ๋ชจ๋ ๋ง๋ฃ๋ ๊ฒฝ์ฐ, Supabase๋ ์๋์ผ๋ก ์ธ์ ์ ์ข ๋ฃํ๊ณ , ์ฌ์ฉ์๋ฅผ ๋ก๊ทธ์์ ์ฒ๋ฆฌํฉ๋๋ค. ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฌํ ๋ก๊ทธ์์ ์ํฉ์ ๊ฐ์งํ๊ณ , ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์ ํด์ผ ํฉ๋๋ค.
supabase.auth.onAuthStateChange((event, session) => {
if (event === 'SIGNED_OUT') {
console.log('์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์๋์์ต๋๋ค.');
window.location.href = '/login'; // ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ฆฌ๋๋ ์
}
});
โ๏ธโ๐ฅ
์๋ ๋ก๊ทธ์์
Supabase๋ ์๋์ผ๋ก ํ ํฐ ๊ฐฑ์ ์ ์ฒ๋ฆฌ๋ฏ๋ก ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ํ์ง ์๋ ํ ๋ก๊ทธ์ธ ์ธ์ ์ด ์ ์ง๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ก๊ทธ์์ํ ๋๋ ์ก์ธ์ค ํ ํฐ๊ณผ ๋ฆฌํ๋ ์ ํ ํฐ์ ๋ชจ๋ ์ญ์ ํด์ผ ํฉ๋๋ค.
- Supabase๋
auth.signOut()๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ธ์ ์ ์ข ๋ฃํ๊ณ , ๊ด๋ จ ํ ํฐ์ ๋ฌดํจํํ์ฌ ์ฌ์ฉ์๊ฐ ๋ ์ด์ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์ ๊ทผํ ์ ์๋๋ก ๋ง๋ญ๋๋ค.await supabase.auth.signOut();
OAuth ์ธ์ฆ ๊ณผ์ ์์ ํต์ ์ค ์ธ์ฆ ์คํจ, ํ ํฐ ๋ง๋ฃ ๋ฑ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค๋ฅ๋ ์ก์ธ์ค ํ ํฐ์ ๋ง๋ฃ, ๋ฆฌํ๋ ์ ํ ํฐ์ ์ ํจ์ฑ ๋ฌธ์ , ๋คํธ์ํฌ ์ค๋ฅ ๋ฑ ๋ค์ํ ์ด์ ๋ก ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ๋ณด์์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
Supabase์์ ์ด๋ฌํ ์ค๋ฅ๋ค์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ณ ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋ ๋ก์ง์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
OAuth ์ธ์ฆ ๊ณผ์ ์์ ์ธ์ฆ ์คํจ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ชป๋ ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์ด๋ ์ค์ ์ค๋ฅ๊ฐ ์์ธ์ผ ์ ์์ผ๋ฉฐ, ์ธ์ฆ ์คํจ ์ ์ฌ์ฉ์์๊ฒ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ณ , ๋ค์ ์๋ํ๊ฑฐ๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ ๋ํ ์ ์์ต๋๋ค.
const { data, error } = await supabase.auth.signInWithOAuth({
provider: 'kakao',
options: {
redirectTo: 'https://{application address}/callback',
}
});
if (error) {
console.error("์ธ์ฆ ์คํจ:", error.message);
alert("์ธ์ฆ์ ์คํจํ์ต๋๋ค. ๋ค์ ์๋ํด ์ฃผ์ธ์.");
} else {
console.log("์ธ์ฆ ์ฑ๊ณต:", data);
}
์ด ๋, ๊ฐ๋ฐ์๋ ์๋ชป๋ Client ID, Client Secret, Redirect URI ์ค์ ์ ์ ๊ฒํ ์ ์์ต๋๋ค.
๋คํธ์ํฌ ์ค๋ฅ๋ ์ผ์์ ์ธ ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์ฌ์๋ ๋ก์ง์ ๊ตฌํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋คํธ์ํฌ ๋ถ์์ ์ผ๋ก ์ธํด ์์ฒญ์ด ์คํจํ๋ฉด, ์์ฒญ์ ๋ค์ ์๋ํ๊ฑฐ๋ ์ผ์ ์๊ฐ ํ์ ๋ค์ ์๋ํ๋๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
supabase์์ log๋ก OAuth ํต์ ์ ์ดํด๋ณผ ์ ์์ต๋๋ค. ์ด ๋, ์์ฒญ URL ๋ค์ ์๋ ๋ถ๋ถ์ด User Agent ์
๋๋ค.

ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ํต์ ํ ๋, ์์ฒญ์ ๋ณด๋ด๋ ๋๋ฐ์ด์ค์ ๋ธ๋ผ์ฐ์ ๋ฑ ์๋ณํ ์ ์๋ ์ฌ์ฉ์ ์ํํธ์จ์ด์ ์ ๋ณด๋ฅผ ๋งํฉ๋๋ค. ์์๋ก ์์ ๋ ์ ์๋ ๊ฐ์ผ๋ก, ์์ฒญ์ ๋ณด๋ธ ์ฌ์ฉ์ ํ๊ฒฝ์ ์์๋ณด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ ๋คํธ์ํฌ์์ Request Headers์์๋ ํ์ธํ ์ ์์ต๋๋ค.

์๋ฒ๋ User Agent๋ฅผ ํตํด ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ๋ธ๋ผ์ฐ์ ๋ ์ฑ์ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ ํด, ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ๋ฐ์คํฌํ์ ๊ตฌ๋ถํ์ฌ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๊ณ , ํน์ ๋ธ๋ผ์ฐ์ ์ ์ต์ ํ๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ํน์ ๊ธฐ๋ฅ์ ์ฐจ๋จํ๋ ๋ฑ์ ์์ ์ ํฉ๋๋ค.
๋ก๊ทธ์ ์์ฒญ๋ง๋ค User Agent๊ฐ ๊ธฐ๋ก๋๋ฏ๋ก, ์๋ฒ ๊ด๋ฆฌ์๋ ํด๋ผ์ด์ธํธ ์ข ๋ฅ์ ๋ฒ์ ๋ถํฌ๋ฅผ ํ์ ํ ์ ์์ต๋๋ค.
๋ณดํต Mozilla ์ ๋ณด/๋ฒ์ + ์ด์์ฒด์ ์ ๋ณด + ๋ ๋๋ง ์์ง ์ ๋ณด + ๋ธ๋ผ์ฐ์ ํํ๋ก ๋ ธ์ถ๋ฉ๋๋ค.
Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Mobile Safari/537.36