springSecurityOAuth2

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•œ ์นด์นด์˜ค ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ

์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์—์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์™€ OAuth2๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ SNS๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์–ป๊ฒŒ ๋œ ์ง€์‹์„ ์ ์Šต๋‹ˆ๋‹ค. Spring Security๋กœ ๊ตฌํ˜„ํ•˜๋Š” OAuth2๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ•œ๊ธ€ ์ž๋ฃŒ๊ฐ€ ์Šคํ”„๋ง ๋ถ€ํŠธ ๊ธฐ๋ฐ˜์ด์—ˆ๊ธฐ์—, ์Šคํ”„๋ง ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํด๋ž˜์Šค ์ƒ์† ๊ตฌ์กฐ์™€ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์ฝ”๋“œ ์ž‘์„ฑ์— ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

OAuth 2.0์™€ ์ฃผ์š” 3๋‹จ๊ณ„ ํ”„๋กœ์„ธ์Šค

๊ณต์‹๋ฌธ์„œ : https://oauth.net/2/arrow-up-right

OAuth 2.0๋Š” OAuth 2.0์€ ์ธ์ฆ์„ ์œ„ํ•œ ์—…๊ณ„ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์œผ๋กœ ์ปค์Šคํ…€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(ex. ์นด์นด์˜ค, ๋„ค์ด๋ฒ„)์— ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด(ex. ์ด๋ฉ”์ผ, ์ƒ๋…„์›”์ผ ๋“ฑ์˜ ์ œํ•œ์  ์ •๋ณด)๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์ ธ์˜จ ์ •๋ณด๋กœ ์ธ์ฆ, ์ธ๊ฐ€ ๋“ฑ์˜ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ๋ชซ์ด๋‹ค. ๋ณดํ†ต ์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐœ๊ธ‰, ํ† ํฐ ๋ฐœ๊ธ‰, ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ์˜ 3๋‹จ๊ณ„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜๋Š” ์„ค๋ช…์ด ๋„ˆ๋ฌด ๊น”๋”ํ•˜๊ฒŒ ๋˜์–ด ์žˆ์–ด์„œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ณต์‹๋ฌธ์„œ์—์„œ ๊ฐ€์ ธ์™€ ๋ดค๋‹ค.

kakao login process

#1. ์ธ๊ฐ€ ์ฝ”๋“œ ๋ฐœ๊ธ‰ : ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ์ง€ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์นด์นด์˜ค๋ฅผ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์นด์นด์˜ค์— ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ž„์„ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์œ„ ๊ทธ๋ฆผ์—์„œ๋„ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๋Š” ๋ณดํ†ต ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ˜•ํƒœ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„ ์ธก์—์„œ๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ ๋‚ด๋ ค์ฃผ๊ณ , ๋™์˜ ํ•ญ๋ชฉ๊นŒ์ง€ ์‘๋‹ต๋ฐ›์œผ๋ฉด ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์„œ๋ฒ„๋กœ ์ธ๊ฐ€ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ redirectํ•˜๊ฒŒ ๋œ๋‹ค. spring security์—์„œ๋Š” "{baseUrl}/{action}/oauth2/code/{registrationId}"์ด default์„ค์ •์˜ redirect url์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, example.com์—์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ณ , ๋กœ๊ทธ์ธ ์•ก์…˜์— ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ฉฐ, ๋ฆฌ์†Œ์†Œ ์„œ๋ฒ„๋กœ๋Š” ์นด์นด์˜ค๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๋ฉด "https://example.com/login/oauth2/code/kakao"๊ฐ€ redirect url์ด ๋˜๊ฒ ๋‹ค. ๋‹น์—ฐํžˆ ์ด redirect url์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์Šคํ”„๋ง์—์„œ ๋ฐ”๊พธ์—ˆ๋‹ค๋ฉด, ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—๋„ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” redirect url์„ค์ •์„ ํ•„์ˆ˜์ ์œผ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

#2. ํ† ํฐ ๋ฐœ๊ธ‰ : ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ฐ›์•˜๋‹ค๋ฉด, ์ธ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์š”์ฒญ์— ๋‹ด์•„ ํ† ํฐ ๋ฐœ๊ธ‰ url๋กœ ๋ณด๋‚ธ๋‹ค. ๊ทธ ํ›„ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ๋ฐ›์€ ์š”์ฒญ์ด ์œ ํšจํ•œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋ƒˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ด์ค€๋‹ค. ์ด ํ† ํฐ์€ ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ๋Š” ์ด ํ† ํฐ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ชฐ๋ผ๋„ ๋œ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ๊ทธ์ € ์ด ํ† ํฐ์ด ๋งˆ์น˜ ํ˜ธํ…”ํ‚ค์ฒ˜๋Ÿผ ์œ ํšจํ•˜๊ฒŒ ๋™์ž‘ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ๋งŒ ์•Œ๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ๋‹น์—ฐํžˆ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์—์„œ๋Š” ์ด ํ† ํฐ์„ ํ•ด์„ํ•˜์—ฌ ์–ด๋–ค ์œ ์ €์˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จํ•ด์•ผ ํ•œ๋‹ค. ํ˜ธํ…” ๋ฝ๋„์–ด๊ฐ€ ํ˜ธํ…”ํ‚ค๋ฅผ ํ•ด์„ํ•˜์—ฌ ๋ฐฉ๋ฒˆํ˜ธ์™€ ํ˜ธํ…”ํ‚ค๊ฐ€ ์ƒ์‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

access token๋ฅผ ํ˜ธํ…” ํ‚ค์นด๋“œ์— ๋น—๋Œ€์–ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•œ ์œ ํŠœ๋ธŒ : https://www.youtube.com/watch?v=BNEoKexlmA4&ab_channel=OktaDevarrow-up-right

#3. ์‚ฌ์šฉ์ž ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ : ํ† ํฐ์„ ๋ฐ›์•˜๋‹ค๋ฉด, ํ† ํฐ์„ Authorizationํ—ค๋”์— ๋‹ด์•„ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ url๋กœ ์š”์ฒญํ•œ๋‹ค.

spring(without spring boot) + spring security ์กฐํ•ฉ์˜ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌํ˜„

OAuth 2.0์€ REST API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋ง์ธ ์ฆ‰์Šจ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์—†์–ด๋„ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ง์ด๋‹ค. ์ด ๋ง์„ ํ•˜๋Š” ์ด์œ ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ, ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์Šคํ”„๋ง์˜ ๋ฒ„์ „์ด ๋„ˆ๋ฌด ๋‚ฎ์•„ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ OAuth2๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ“จ์–ดํ•˜๊ฒŒ REST API๋ฅผ ์‚ฌ์šฉํ•ด์„œ OAuth2๋ฅผ ๊ตฌํ˜„ํ•œ ํ›„ ์ด๋ฅผ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์™€ ํ†ตํ•ฉํ•˜๋Š” ๋กœ์ง์„ ๊ตฌํ˜„ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (๋ฉ”์ด๋ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ 5.x์ด์ƒ ๋ฒ„์ „๋ถ€ํ„ฐ oauth2 client๋ฅผ ์ง€์›ํ•œ๋‹ค.) ํ•˜์ง€๋งŒ ์Šคํ”„๋ง์—์„œ๋Š” ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณด์•ˆ ๊ด€๋ จ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ , ์ธ์ฆ, ์ธ๊ฐ€, ์‹œํ๋ฆฌํ‹ฐ ํ•„ํ„ฐ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ, ๋˜๋„๋ก์ด๋ฉด ๋ฒ„์ „์—…์„ ํ•ด์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ OAuth2๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์˜ณ๊ฒ ๋‹ค.

#1. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(ex. ์นด์นด์˜ค)์— ์‚ฌ์šฉ์ž(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜) ๋“ฑ๋กํ•˜๊ธฐ

OAuth2.0์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์„œ๋น„์Šค์— ๋กœ๊ทธ์ธํ•ด์„œ ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด ์„œ๋น„์Šค์— ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ๋‹ค๊ณ  ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์นด์นด์˜ค๋ฅผ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์นด์นด์˜ค ๊ณต์‹ ๋ฌธ์„œ์— ์ž์„ธํžˆ ๋‚˜์™€ ์žˆ๋‹ค.

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ณต์‹๋ฌธ์„œ : https://developers.kakao.com/docs/latest/ko/kakaologin/commonarrow-up-right

#2. ์‚ฌ์šฉ์ž(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์— ๋“ฑ๋ก์ •๋ณด ์„ค์ •ํ•˜๊ธฐ

clientregistration์„ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ๊ตฌ๊ธ€, ํŽ˜์ด์Šค๋ถ, ๊นƒํ—ˆ๋ธŒ๋ฅผ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ CommonOAuth2Provider ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„ํŽธํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์นด์นด์˜ค, ๋„ค์ด๋ฒ„๊ฐ™์€ ๊ฒฝ์šฐ ์ง์ ‘ OAuth2Provider๋ฅผ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•œ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์„ค์ •ํ•˜์ž.

spring security without boot ๊ณต์‹ ๋ฌธ์„œ ์ฐธ๊ณ  ์ฝ”๋“œ : https://docs.spring.io/spring-security/reference/servlet/oauth2/login/core.html#oauth2login-javaconfig-wo-bootarrow-up-right

#3. OAuth2 ๋กœ๊ทธ์ธ ๋“ฑ๋กํ•˜๊ธฐ

Last updated