[Spring boot] Spring boot Security๋ก ์์ํด๋ณด๋ ์ธ์ฆ
Spring Framework๋ฅผ ์ด์ฉํ์ฌ ์น ์๋น์ค๋ REST API ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋๋ฉด ๊ฐ์ฅ ํ์๋ก ํ๋ ๊ฒ์ ๋ฐ๋ก ์ธ์ฆ์ผ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ์ธ์ฆ์ด๋, ๋ด๊ฐ ๊ฐ๋ฐํ ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ์๋ณํ๊ณ ์ ํ๋ ์ฌ์ฉ์ ํน์ ๊ด๋ฆฌ์๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก Spring์ ์ด์ฉํด์ ์ธ์ฆ ๋ก์ง์ ๊ตฌํํ๊ณ ์ ํ๋ค๋ฉด, JPA๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ Entity๋ฅผ ๋ง๋ค๊ณ , ์ฐ๋ํ์ฌ ์์ด๋์ ํจ์ค์๋๋ฅผ ๋๊ธฐํ ํ ํ, ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ์์ผ๋ก ๋ก์ง์ ๊ตฌํํ ์ ์์ ๊ฒ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ด๋ฅผ ์ง์ ๊ตฌํํ์ง ์์๋ ์ด๋ฏธ ์ ๋ง๋ค์ด์ง ๋ชจ๋์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ฐ๋ก Spring boot Security์ ๋๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ Spring boot Security๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋์ง, ์ฌ์ฉํ๊ธฐ ์ํด ์ด๋ค ๊ฐ๋ ๋ค์ ๊ณต๋ถํด์ผ ํ๋์ง, ๋์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์์๋ณด๊ณ , ์ต๊ทผ ์์ฃผ ์ฌ์ฉํ๋ OAuth2 ์ธ์ฆ ๋ฐฉ์์ ์ด์ฉํ์ฌ ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํด๋ณด๊ธฐ ์ , ์ด๋ป๊ฒ ๋์ํ๋์ง์ ๋ํด ์์๋ณด๋ ์๊ฐ์ ๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.
Spring boot Security
์คํ๋ง ๋ถํธ์์๋ ์ธ์ฆ๊ณผ ๊ถํ์ ๊ด๋ จ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ ์คํ๋ง ๋ถํธ ์ํ๋ฆฌํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ธฐ์กด ์คํ๋ง ์ํ๋ฆฌํฐ์ ๋ฒ๊ฑฐ๋ก์ด ์ค์ ์ ์ค์ด๊ณ , ๊ฐ๋ฐ์๊ฐ ๋ณด์ ๋ฌธ์ ์ ๊น์ด ์ ๊ฒฝ์ฐ์ง ์๊ณ ๋ ์ธ์ฆ์ ๋ํ ํต์ฌ ๋ก์ง๋ง์ ๊ฐ๋ฐํ ์ ์๋๋ก ํ ๋ชจ๋์ ๋๋ค. ์ ๋ง ํธ๋ฆฌํ์ง์.
์ด ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ๊ฐ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์ค์ํ ๊ฐ๋ ์ ๋ ๊ฐ์ง์ ๋๋ค. ๋ฐ๋ก ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ์ธ๋ฐ์. ์ธ์ฆ์ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ๋์์ ๊ดํ์ฌ ์ธ์ฆ๋ ์ฌ์ฉ์์ธ์ง๋ฅผ ํ์ธํ๋ ์ ์ฐจ์ด๊ณ , ๊ถํ ๋ถ์ฌ๋ ๋ฐ์ดํฐ๋ ํ๋ก๊ทธ๋จ ๋ฑ์ ํน์ ์์์ด๋ ์๋น์ค์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ๋ ์ผ์ ๋๋ค.
์ฝ๊ฒ ์๋ฅผ ๋ค์๋ฉด, ์น ์ฌ์ดํธ์์ ์ด๋ค ์๋น์ค๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ๋ด๊ฐ ์ด๋ค ์ฌ์ฉ์์ธ์ง ํ์ธํ๊ณ , ๊ทธ์ ๋ง๋ ๊ถํ์ ๋ถ์ฌํ์ฌ ์ฌ์ฉ์ ๋์์ฃผ๋ ๋ ์์ด๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
OAuth2
๋ ํ ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๊ฐ๋ ์ด ์๋๋ฐ, ์ต๊ทผ์๋ ๋ค์ํ ์ธ์ฆ ๋ฐฉ์์ด ๋์ค๊ณ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ID/PW ์ธ์ฆ ๋ฟ๋ง ์๋๋ผ ์ฌ๊ธฐ์ AD/LDAP ๋ฑ์ ๋๋ ํฐ๋ฆฌ ํตํฉ ์ธ์ฆ, ๊ทธ๋ฆฌ๊ณ Social Network์ ๋ฑ์ฅ์ผ๋ก OAuth2๋ผ๋ ํตํฉ ์ธ์ฆ๊น์ง ๋ฑ์ฅํ์ง์.
์ฌ๊ธฐ์ OAuth๋, ํ ํฐ์ ์ฌ์ฉํ ๋ฒ์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์ธ์ฆ์ ์ ๊ณตํ๋ ํ์ค ์ธ์ฆ ํ๋กํ ์ฝ์ ๋๋ค. ์์ ๋ถ์ด ์๋ 2๋ ๋ฒ์ ์ผ๋ก ์ต๊ทผ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ OAuth ํ๋กํ ์ฝ 2.0 ๋ฒ์ ์ธ ๊ฒ์ด์ง์.
OAuth2์์ ์ ๊ณตํ๋ ์น์ธ ํ์ ์ ์ด 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์
(Authorization Code Grant Type)
ํด๋ผ์ด์ธํธ๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์ ๋์ ํน์ ๋ฆฌ์์ค์ ์ ๊ทผ์ ์์ฒญํ ๋ ์ฌ์ฉํ๋ ํ์ ์ ๋๋ค. ๋ฆฌ์์ค ์ ๊ทผ์ ์ํ ์ฌ์ฉ์ ์์ด๋์ ๋น๋ฐ๋ฒํธ, ๊ถํ ์๋ฒ์ ์์ฒญํด์ ๋ฐ์ ๊ถํ ์ฝ๋๋ฅผ ํจ๊ป ํ์ฉํ์ฌ ๋ฆฌ์์ค์ ๋ํ ์ก์ธ์ค ํ ํฐ์ ๋ฐ์ผ๋ฉด ์ด๋ฅผ ์ธ์ฆํ์ฌ ์ด์ฉํ๋ ๋ฐฉ์ - ์์์ ์น์ธ ํ์
(Implicit Grant Type)
๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์ ๊ณผ ๋ค๋ฅด๊ฒ ๊ถํ ์ฝ๋ ๊ตํ ๋จ๊ณ ์์ด ์ก์ธ์ค ํ ํฐ์ ์ฆ์ ๋ฐํ๋ฐ์ ์ด๋ฅผ ์ธ์ฆ์ ์ด์ฉํ๋ ๋ฐฉ์ - ๋ฆฌ์์ค ์์ ์ ์ํธ ์๊ฒฉ ์ฆ๋ช
์น์ธ ํ์
(Resource Owner Password Credentials Grant Type)
ํด๋ผ์ด์ธํธ๊ฐ ์ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ํฐ์ ๋ํ ์ฌ์ฉ์์ ์๊ฒฉ ์ฆ๋ช ์ ๊ตํํ๋ ๋ฐฉ์ - ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช
์น์ธ ํ์
(Client Credentials Grant Type)
ํด๋ผ์ด์ธํธ๊ฐ ์ปจํ ์คํธ ์ธ๋ถ์์ ์ก์ธ์ค ํ ํฐ์ ์ป์ด ํน์ ๋ฆฌ์์ค์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์
ํ์ ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ, ์ด ์ค์์ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋ ํ์ ์ ๋ฐ๋ก ๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์ ์ ๋๋ค. Google, Facebook, Kakao ๋ฑ ๋ค์ํ ์์ ๋ฏธ๋์ด ์๋น์ค๋ค์ด ์ฌ์ฉํ๋ ํ์ ์ด๋ฉฐ ๋ณดํต ์น ์๋ฒ ํํ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ง์ํ๋ ๋ฐ ์์ด ์ฅ๊ธฐ ์ก์ธ์ค ํ ํฐ์ ์ด์ฉํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
OAuth2 ๋์ ๊ณผ์
๊ทธ๋ ๋ค๋ฉด ์ด๋ ๊ฒ ์์ ๋ฏธ๋์ด ์๋ฒ๋ก๋ถํฐ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐ ์ด๋ค์์ผ๋ก ๋์์ด ๋๋ ๊ฒ์ผ๊น์?
์์ ๊ฐ์ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ผ๋ก ๋์ํ๊ธด ํ์ง๋ง, ๊ทธ๋ฆผ์ผ๋ก ๋ณด๊ธฐ์๋ ๊ต์ฅํ ๋ณต์กํฉ๋๋ค. ๊ฐ๋จํ ์ค๋ช ์ ๋๋ฆฌ๊ฐ ์ ์, ๊ฐ Object๊ฐ ๋ฌด์์ธ์ง๋ฅผ ๋จผ์ ๋ง์๋๋ฆฌ๋ฉด...
- Resource Owner: ์๋น์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ ์ฌ์ฉ์
- Client: ์น ์ฌ์ดํธ ํน์ API ์๋ฒ
- Permission Server: ์์ ๋ฏธ๋์ด ๊ถํ ๋ถ์ฌ ์๋ฒ
- Resource Server: ์์ ๋ฏธ๋์ด ๋ฆฌ์์ค ์๋ฒ
์ด๋ ๊ฒ ๊ตฌ์ฑ์ด ๋์ด ์๋๋ฐ์. ๊ถํ ์๋ฒ๋ ํด๋น ์ฌ์ฉ์๊ฐ ์ฐ๋ฆฌ ์์ ๋ฏธ๋์ด์ ์ฌ์ฉ์์ธ์ง๋ฅผ ์ฒดํฌํ๋ ๊ฒ์ด๊ณ , ๋ฆฌ์์ค ์๋ฒ๋ ์ด๋ฅผ ์ธ์ฆํ ์ ์๋๋ก ์ ๊ณตํด์ฃผ๋ ํ ํฐ ๋ฐ๊ธ ์๋ฒ์ ๋๋ค.
๋จผ์ ์ฒ์์๋ Client(์น ์ฌ์ดํธ)๊ฐ ํ๋ผ๋ฏธํฐ๋ก Client ID, Redirect URI, ์๋ต ํ์ ์ code๋ก ์ง์ ํ์ฌ ๊ถํ ์๋ฒ์ ์ ๋ฌํฉ๋๋ค. ์ด ๋ Client ID๋ ์ฌ๋ฌ๋ถ๋ค์ด ํ ๋ฒ ์ฏค ์์ ๋ฏธ๋์ด ๊ฐ๋ฐ API๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋ Client ID๋ฅผ ๋งํฉ๋๋ค. ์ฆ ๋ด๊ฐ ๋ง๋ ์น ์๋น์ค๊ฐ ์๋ ์์ ๋ฏธ๋์ด์ ํด๋ผ์ด์ธํธ๋ฅผ ์ด์ผ๊ธฐํ๋ ๊ฒ์ด์ง์.
์ ์์ ์ผ๋ก ์์ ๋ฏธ๋์ด์์ ํด๋ผ์ด์ธํธ ์ธ์ฆ์ด ํ์ธ๋์๋ค๋ฉด, ๊ถํ ๋ถ์ฌ ์ฝ๋๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ ๋๋ค. (์ด ๋, ๊ถํ ๋ถ์ฌ ์ฝ๋๊ฐ code์ด๋ฉด, ๊ถํ ๋ถ์ฌ ์ฝ๋ ์น์ธ ํ์ , token์ด๋ฉด ์์์ ์น์ธ ํ์ ) ํด๋ผ์ด์ธํธ๋ ์ด ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ, ๋ง์ง๋ง์ผ๋ก ์ก์ธ์ค ํ ํฐ์ ๊ถํ ์๋ฒ์ ์ถ๊ฐ๋ก ์์ฒญํฉ๋๋ค. ์ด ๋ ํ์ํ ํ๋ผ๋ฏธํฐ๋ Client ID, Client Secret, Redirect URI, ์ธ์ฆ ํ์ ์ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์๋ต ๋ฐ์ ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค ์๋ฒ์ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํฉ๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋, ์ด๋ฉ์ผ, ์ด๋ฆ ๋ฑ ๋ค์ํ ๊ฐ์ธ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ด๊ฐ ๋ง๋ ์๋ฒ๊ฐ ์์ ๋ฏธ๋์ด์ ๋ก๊ทธ์ธ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์ ๋ฏธ๋์ด ์๋ฒ์ ์ฌ์ฉ์์ ๊ฐ์ธ ์ ๋ณด๋ฅผ ์์ฒญํ๊ธฐ ์ํ ํ ํฐ ๋ฐ๊ธ ๊ณผ์ ์ ํฌํจํ์ฌ ์ด 3๋จ๊ณ์ API ์์ฒญ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค. ๊ธฐ์กด์ ID/Password ๋ก๊ทธ์ธ ๋ฐฉ์์ ๋นํต์ API ์์ฒญ์ ๋ง์ด ํ๋ค๋ ์ ์ด ๋ณด์ด๋ ๊ฒ์ด์ง์.
ํ์ง๋ง ์ฌ์ฉ์ ์ ์ฅ์์๋ ๋ณต์กํ ํ์ ๊ฐ์ ์ ์ฐจ ์์ด ๊ธฐ์กด์ ์์ ๊ณ์ ์ผ๋ก ๋ด ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์๋ค๋ ๋ฉ๋ฆฌํธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋น์ค ์ธก๋ฉด์์๋ ํ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ถ์ํ๋ ์ ์ ์์ด ํธ๋ฆฌํ๋ค๊ณ ํ ์ ์์ง์.
OAuth2๋ฅผ ์ฌ์ฉํ ์ธ์ฆ ๊ณผ์
์์ ์ํ์ค ๋ค์ด์ด๊ทธ๋จ์ ํตํด์ ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ๋ฏธ๋์ด ์๋ฒ๋ฅผ ํตํด ์ด๋ค์์ผ๋ก ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ๊ฐ์ง ์ ์๋์ง๋ฅผ ์ดํดํ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ด ์๋น์ค๋ก ์ธ์ฆ ๊ณผ์ ์ ์งํํ๊ณ , ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ ์ด๋ค์์ผ๋ก ๋์ํ๋ ๊ฒ์ผ๊น์?
๋ณดํต User, Password ํํ๋ก ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๋ก๊ทธ์ธ ์ ๋ณด๋ฅผ ์๋ฒ ๋ด ์ธ์ ์ ์ ์ฅํด๋์ ๊ฒ์ ๋๋ค. ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ก๊ทธ์ธ๋ ์ธ์ ์ ๋จผ์ ํ์ธํ ๋ค์, ๊ธฐ์กด ์ธ์ ์ด ์กด์ฌํ๋ค๋ฉด URI๋ฅผ ์์ฒญํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๊ฐ์ ๋ ์ฌ์ฉ์์ธ์ง๋ฅผ ํ์ธํ ๋ค์, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์ ์์ ์๋ฒ์ ์์ฒญํ์ฌ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ ํ, ์๋ ํ์ ๊ฐ์ ์ ์ฐจ๋ฅผ ์งํํ๋ ๋ฐฉํฅ์ผ๋ก ์์ ๋ก๊ทธ์ธ์ ๊ตฌํํ ์ ์์ต๋๋ค.
์ด ๋, ๊ฐ ์์ ์๋น์ค๋ณ๋ก User ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๊ฒ ์ฃผ๋ ์ด์ ๋ ์๋น์ค๋ณ๋ก ๋ฐํํ๋ ์ ๋ณด๋ค์ด ๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ๊ทธ๋ค ๋๋ฉ์ธ์ ๋ง๊ฒ Class๋ฅผ ๋ณ๋๋ก ๊ตฌํํด์ผ ํ๊ณ , DB์ ์ ์ฅํ๋ฉด ๋ฉ๋๋ค.
๋ง์น๋ฉฐ...
์ฌ๊ธฐ๊น์ง ๊ฐ๋จํ๊ฒ Spring boot Security์ OAuth2์ ๋ํด ์์๋ดค์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋๋ ์ฝ๊ณ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์์ ๋ก๊ทธ์ธ ์๋น์ค๋ฅผ ์ง์ ๊ตฌํํ๊ณ ๋์ ๋ฐฉ์์ ํ์ธํด๋ณธ๋ค๋ฉด, ์ฒ์์๋ ๊ต์ฅํ ์ด๋ ค์ธ ์๋ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ์๋ฆฌ๋ฅผ ์ ๋๋ก ์๋ค๋ฉด, ๊ทธ๋ ๊ฒ ์ด๋ ต์ง๋ ์์ต๋๋ค.
๋ค์ ํฌ์คํธ์์๋ ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ , Spring boot Security๋ฅผ ์ด์ฉํ์ฌ OAuth2๋ฅผ ๊ตฌํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Argument Resolver๋ฅผ ์ด์ฉํ ์ ์ฐ์ฑ ์๋ ํ๋ผ๋ฏธํฐ ์ฒ๋ฆฌ (2) | 2020.08.12 |
---|---|
[Spring boot] Spring boot Security๋ฅผ ์ด์ฉํ OAuth2 ์ธ์ฆ ๊ตฌํ 1 - Google ๊ณ์ ์ธ์ฆ (0) | 2020.08.10 |
[Spring] JPA์ ํ๋ฌ์(flush) (0) | 2020.07.02 |
[Spring] JPA ์์์ฑ ์ปจํ ์คํธ ๊ตฌ์กฐ๋ก ๋ณด๋ ์ด์ (2) | 2020.06.24 |
[Spring] JPA์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ (0) | 2020.06.23 |