[TIL] OAuth2 ์ธ์ฆ
๐๐ป OAuth2
- ํด๋ผ์ด์ธํธ - ์๋ฒ - ์ 3์ ์๋น์ค ์ฌ์ด์ ์ธ์ฆ
- ์ธ์ฆ์ ์ํ ํ์ค ํ๋กํ ์ฝ์ ํ ์ข ๋ฅ
- ๋ณด์๋ ๋ฆฌ์์ค์ ์ ๊ทผ(์์ธ์ค)ํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ์๊ฒ ๊ถํ์ ์ ๊ณตํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ํ๋กํ ์ฝ
- ์ฆ, ์ด๋ฏธ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ ์น ์๋น์ค ( ์นด์นด์ค, ๊นํ, ๊ตฌ๊ธ, ํ์ด์ค๋ถ ๋ฑ )์์ ์ฌ์ฉ์ ์ธ์ฆ์ ๋์ ํด์ฃผ๊ณ
์ ๊ทผ ๊ถํ์ ๋ํ ํ ํฐ์ ๋ฐ๊ธํ ํ ์ด๋ฅผ ์ด์ฉํด์ ๋ด ์๋ฒ์์ ์ธ์ฆ์ด ๊ฐ๋ฅํด์ง
- ์ธ์ฆ๋ง ๋ค๋ฅธ ์๋น์ค์ ๋งก๊ธฐ๊ณ ์ธ๊ฐ๋ ๋ด ์๋ฒ์์ !
โ ํธ๋ฆฌํ ์ธ์ฆ โก ๋ณด์์ ์ด์
๐ก Resource Owner
- ์ก์ธ์ค ์ค์ธ ๋ฆฌ์์ค์ ์ ์
- ๊ทธ๋ฆผ์์ User๋ฅผ ์๋ฏธ ( User์ Facebook ๊ณ์ ์ ์ด์ฉํด์ APP์ ๋ก๊ทธ์ธ ํ ๊ฒฝ์ฐ User๋ Resource Owner)
๐ก Client
- Resource Owner๋ฅผ ๋์ ํ์ฌ ๋ณดํธ๋ ๋ฆฌ์์ค์ ์์ธ์ค ํ๋ ์์ฉ ํ๋ก๊ทธ๋จ
- ๊ทธ๋ฆผ์์ APP์ ์๋ฏธ ( User๊ฐ A๋ผ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ Facebook์ ์์ ๋ก๊ทธ์ธ์ ์ด์ฉํด ์ฌ์ฉํ๋ค๋ฉด A๋ ํด๋ผ์ด์ธํธ )
๐ก Resource Server
- User์ ๋ฆฌ์์ค๋ฅผ ๊ฐ์ง๊ณ ์๊ณ Client์ ์์ฒญ์ ์๋ฝํ๊ณ ์๋ตํ ์ ์๋ ์๋ฒ
- Authorization Server๋ฅผ ํตํด ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์
- ๊ทธ๋ฆผ์์ Facebook์ ์๋ฏธ ( A๋ผ๋ App์ด Facebook ํ๋กํ ์ฌ์ง์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ Facebook์ด ๋ฆฌ์์ค ์๋ฒ )
๐ก Authorization Server
- Resource Server๊ฐ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ์๋ฒ
- ๊ทธ๋ฆผ์์ Facebook์ ์๋ฏธ
๐ก Authorization Grant
- ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์ค ํ ํฐ์ ์ป๋ ๋ฐฉ๋ฒ
โ Authorization Code Grant Type
โก Client Credentials Grant Type
โข Implicit Grant Type
โฃ Resource Owner Credentials Grant Type
๐ก Authorization Code
- Access token์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ ์ ํ์ํ ์ฝ๋
- ํด๋ผ์ด์ธํธ ID๋ก ์ด ์ฝ๋๋ฅผ ๋ฐ์์จ ํ, ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ๊ณผ ์ฝ๋๋ฅผ ์ด์ฉํด ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ ๊ฐ๋ฅ
๐ก Access Token
- ๋ณดํธ๋ ๋ฆฌ์์ค์ ์์ธ์คํ๋๋ฐ ์ฌ์ฉ๋๋ ์ธ์ฆ ํ ํฐ
- Authorization Code์ Client Secret์ ์ด์ฉํด ๋ฐ์์จ ์ก์ธ์ค ํ ํฐ์ผ๋ก ๋ฆฌ์์ค ์๋ฒ์ ์ ๊ทผ
๐ก Scope
- ํ ํฐ์ ๊ถํ ( ์ ๊ทผ ๊ถํ ์ง์ ๊ฐ๋ฅ )
- ์ฃผ์ด์ง ์ก์ธ์ค ํ ํฐ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ์ ์๋ ๋ฆฌ์์ค ๋ฒ์
๐ OAuth2 ์ ๋์ ๋ฐฉ์
โช๏ธ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ํ๋กํ ์ฝ : ์ธ์ฆ ๋ฐฉ์
โธ Authorization Code Grant : ๊ถํ ๋ถ์ฌ ์น์ธ ์ฝ๋ ๋ฐฉ์
- ๊ถํ ๋ถ์ฌ ์น์ธ์ ์ํด ์์ฒด ์์ฑํ Authorization Code๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์
- ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ๊ถํ ๋ถ์ฌ ์น์ธ ์์ฒญ ์ ์๋ต ํ์ ์ Code๋ก ์ง์ ํ์ฌ ์์ฒญ
โธ Client Credentials Grant : ํด๋ผ์ด์ธํธ ์๊ฒฉ ์ฆ๋ช ์น์ธ ๋ฐฉ์
- ํด๋ผ์ด์ธํธ ์์ ์ด ๊ด๋ฆฌํ๋ ๋ฆฌ์์ค ํน์ ๊ถํ ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ ํ๋ ๋ฆฌ์์ค ์ ๊ทผ ๊ถํ ์ค์ ๋๋ฉด ์ฌ์ฉ ๊ฐ๋ฅ
- ์๊ฒฉ ์ฆ๋ช ์ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์๋ ํด๋ผ์ด์ธํธ์์๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
โธ Implicit Grant : ์๋ฌต์ ์น์ธ ๋ฐฉ์
- ๋ณ๋์ ๊ถํ ๋ถ์ฌ ์น์ธ ์ฝ๋ ์์ด ๋ฐ๋ก ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์
- ์๊ฒฉ์ฆ๋ช ์ ์์ ํ๊ฒ ์ ์ฅํ๊ธฐ ํ๋ ํด๋ผ์ด์ธํธ์๊ฒ ์ต์ ํ๋ ๋ฐฉ์
- ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
- Client Secret์ ํตํด ํด๋ผ์ด์ธํธ ์ธ์ฆ๊ณผ์ ์ ์๋ต
- ๊ถํ ๋ถ์ฌ ์น์ธ ์์ฒญ ์ ์๋ตํ์ ์ token์ผ๋ก ์ง์ ํ์ฌ ์์ฒญ
โธ Resource Owner Password Credential Grant : ์์ ์์ ์ ์๊ฒฉ ์ฆ๋ช ์น์ธ ๋ฐฉ์
- ๊ฐ๋จํ๊ฒ ๋ก๊ทธ์ธ์ ํ์ํ ์ ๋ณด๋ก ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋ ๋ฐฉ์
- ์์ ์ ์๋น์ค์์ ์ ๊ณตํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ๋๋ ์ธ์ฆ ๋ฐฉ์์ผ๋ก ๋ฆฌํ๋ ์ ํ ํฐ ์ฌ์ฉ ๊ฐ๋ฅ
- ์๋ฅผ ๋ค์ด ๋ค์ด๋ฒ ๊ณ์ ์ผ๋ก ๋ค์ด๋ฒ ์นํฐ์ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ์ ํด๋น
๐ Principal Details
- UserDetails๋ฅผ ๊ตฌํํ๋ ๊ฐ์ฒด
* Spring Security ์ธ์ ์ ๋ณด๋ ๋จ 1๊ฐ์ง ํ์ ์ธ Authentication ๊ฐ์ฒด๋ง ๊ฐ์ง๊ณ ์์ ์ ์์
โช๏ธ Authentication ๊ฐ์ฒด๋ฅผ ๋ด๋ 2๊ฐ์ง ํ๋
โ OAuth2User
- OAuth2๋ก ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ์ ํ๋ฉด OAuth2User๋ฅผ ํตํด ์ฒ๋ฆฌ ํ๊ฒ ๋จ
โก UserDetails
- ํ์๊ฐ์ ์ ํ๋ฉด UserDetails๋ฅผ ํตํด ์ฒ๋ฆฌ๋จ
→ OAuth2User์ UserDetails์๋ Member ๊ฐ์ฒด๋ฅผ ํฌํจํ์ง ์์
๐๐ป ํด๊ฒฐ๋ฐฉ๋ฒ
(1) UserDetails๋ฅผ PrincipalDetails์ implements ํ ๋ค Member ๊ฐ์ฒด์ ๋ด๊ฒ ํจ
- Authentication ๊ฐ์ฒด๋ฅผ ๊ฐ๋ PrincipalDetails๊ฐ ๋ง๋ค์ด์ง๊ฒ ๋จ
- PrincipalDetails ๊ฐ์ฒด์๋ Member๊ฐ ํฌํจ๋จ
(2) OAuth2User ๋ํ ๊ฐ์ ๋ฌธ์ ์ ์ ๊ฐ์ง๊ณ ์๊ณ ์ผ๋ฐ ํ์๊ฐ์ ๋ฐ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ์ OAuth ์ฒ๋ฆฌ๊ฐ ๋ณ๋๋ก ์ฒ๋ฆฌ๋์ด ๋ฌธ์ ๋ฐ์
- PrincipalDetails implements UserDetails, OAuth2User๋ฅผ ํตํด ๋ฌธ์ ํด๊ฒฐ
์ฆ, Spring Security์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ธ์ ์ ์ฅ์์ธ SecurityContextHolder์ ์ธ์ฆ ๊ฐ์ฒด๋ฅผ ์ ์ฅ
→ ์ธ์ฆ ๊ฐ์ฒด์ ํ์ ์ " Authentication " ํ์ ํ ๊ฐ์ง
- Authentication์ AbstractAuthenticationToken์ผ๋ก ๊ตฌํ๋์ด ์๊ณ ์ด๋ฅผ
UsernamePasswordAuthenticationToken๊ณผ OAuth2LoginAuthenticationToken์ด ๊ตฌํํ๊ณ ์์
= AbstractAuthenticationToken = UsernamePasswordAuthenticationToken + OAuth2LoginAuthenticationToken + ..
- UserDetails, OAuth2User์ ๋ฐํํ๋ฉด ์คํ๋ง์ด ์์์
UserDetails๋ UsernamePasswordAuthenticationToken์ผ๋ก,
OAuth2User์ OAuth2LoginAuthenticationToken์ผ๋ก ๋ณํ
- UsernamePasswordAuthenticationToken๊ณผ OAuth2LoginAuthenticationToken์
Authentication์ ์์์ด๋ SecurityContextHolder์ ์ ์ฅํ ์ ์๊ฒ ๋จ
* FormLogin์ผ๋ก ๋ก๊ทธ์ธ ํ๋ ๊ฒฝ์ฐ
- ์ฌ์ฉ์๊ฐ ์ง์ ํ์๊ฐ์
์ ๊ฑฐ์น ํ ๋ก๊ทธ์ธ ํ๊ธฐ ๋๋ฌธ์
loadUserByUsername์์ ํ์์ ์ฐพ๊ณ ์ ๋ณด๋ฅผ ๋ฐํ
* OAuth2๋ก ๋ก๊ทธ์ธ ํ๋ ๊ฒฝ์ฐ
- ์ฌ์ฉ์๊ฐ ํ์๊ฐ์
์ ํ์ง ์๊ธฐ ๋๋ฌธ์
loadUSerByUsername์์ ํ์์ ์ฐพ๊ณ
(์๋ ํ์)์ด๋ผ๋ฉด ํ์๊ฐ์
์ฒ๋ฆฌ๋ฅผ
(์๋ ํ์)์ด๋ผ๋ฉด FormLogin๊ณผ ๋์ผํ๊ฒ ์ ๋ณด ๋ฐํ
๐ก@AuthenticationPrincipal
- ๋ก๊ทธ์ธ์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋งค๋ฒ ์ฌ์ฉ์์๊ฒ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ผ ๋ ๋ง๋ค DB์ ์ ๊ทผํด์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋นํจ์จ
- ํ ๋ฒ ์ธ์ฆ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ธ์ ์ ๋ด์๋๊ณ ์ธ์ ์ด ์ ์ง๋๋ ๋์ ์ ์ ๊ฐ์ฒด๋ฅผ DB ์ ๊ทผ ์์ด ๊ฐ์ ธ๋ค ์ธ ์ ์์
(1) ์ปจํธ๋กค๋ฌ์์ Principal ๊ฐ์ฒด ์ฃผ์ ๋ฐ์ ์ฌ์ฉ
(2) ์ปจํธ๋กค๋ฌ์์ @AuthenticationPrincipal ์ ์ธํ์ฌ ์ํฐํฐ ๊ฐ์ฒด ๋ฐ์์ค๊ธฐ
(3) ์ปจํธ๋กค๋ฌ์์ @AuthenticationPrincipal ์ ์ธํ์ฌ ์ํฐํฐ์ ์ด๋ํฐ ๊ฐ์ฒด ๋ฐ์์ค๊ธฐ