์ถ์ฒ : ๋ด์ผ๋ฐฐ์์บ ํ
Open Standard for Authorization
์ฆ, ๊ฐ๋ฐฉํ Authorization ์ ํ์ค์ด๋ฉฐ API ํ๊ฐ(Authorize)๋ฅผ ๋ชฉ์ ์ผ๋ก
JSON ํ์์ผ๋ก ๊ฐ๋ฐ๋ HTTP ๊ธฐ๋ฐ์ ๋ณด์ ํ๋กํ ์ฝ.
์ฌ์ฉ์๋ค์ด ์ฌ์ฉํ๊ณ ์ ํ๋ ์น์ฌ์ดํธ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณตํ์ง ์๊ณ
์ ๊ทผ ๊ถํ์ ๋ถ์ฌ ๋ฐ์ ์ ์๊ฒ ํด์ฃผ๋ ๊ณตํต์ ์๋จ์ผ๋ก์ ์ฌ์ฉ ๋์ด์ง๋ ๊ธฐ์
๋ค์ํ ํด๋ผ์ด์ธํธ ํ๊ฒฝ์ ์ ํฉํ ์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ(Authorization) ์ ์์ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ
๊ทธ ๊ฒฐ๊ณผ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ๊ทผ ํ ํฐ (Access Token) ์ ๋ฐ๊ธํ๋ ๊ฒ์ ๋ํ ๊ตฌ์กฐ
๊ฐ์ : ์นด์นด์ค๋ฅผ ์ด์ฉํ OAuth2 ๋ก๊ทธ์ธ ์๋น์ค ๊ตฌํ
1. ํ์๊ฐ์ ์ค๊ณ
1) User ํ ์ด๋ธ
์ปฌ๋ผ ์ด๋ฆ | ์ปฌ๋ผ ํ์ | ์ค๋ณต ํ์ฉ | ์ค๋ช |
id | Long | X | ํ ์ด๋ธ ID(PK) |
username | String | X | ํ์ ID |
password | String | O | ๋น๋ฐ๋ฒํธ |
String | X | ์ด๋ฉ์ผ ์ฃผ์ | |
role | String | O | ์ญํ : ์ฌ์ฉ์ - User ๊ด๋ฆฌ์ - Admin |
์นด์นด์ค ์ฌ์ฉ์ ์ ๋ณด Json : 1. kakoId, 2. nickname, 3.email
{
"id": 1632335751,
"properties": {
"nickname": "๋ฅดํ์ด",
"profile_image": "http://k.kakaocdn.net/...jpg",
"thumbnail_image": "http://k.kakaocdn.net/...jpg"
},
"kakao_account": {
"profile_needs_agreement": false,
"profile": {
"nickname": "๋ฅดํ์ด",
"thumbnail_image_url": "http://k.kakaocdn.net/...jpg",
"profile_image_url": "http://k.kakaocdn.net/...jpg"
},
"has_email": true,
"email_needs_agreement": false,
"is_email_valid": true,
"is_email_verified": true,
"email": "letan@sparta.com"
}
}
2) ํ ์ด๋ธ ์ค๊ณ ์ต์
(1) ์นด์นด์ค User(KakaoUser) ํ ์ด๋ธ์ ํ๋ ๋ ๋ง๋ ๋ค
์ฅ์ : ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค ~ ๊ฐ ํ ์ด๋ธ์ ๋ณํ์ ์๋ก ์ํฅ์ ์ฃผ์ง ์๋๋ค
๋จ์ : ๊ตฌํ ๋์ด๋ ์์น
(2) ๊ธฐ์กด User ํ ์ด๋ธ์ ์นด์นด์ค User ์ปฌ๋ผ ์ถ๊ฐ
์ฅ์ : ๊ตฌํ ๋จ์
๋จ์ : ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค ~
ํผ ๋ก๊ทธ์ธ ๋ฐฉ์์ ์ฌ์ฉ, ์นด์นด์ค ์ฌ์ฉ์์ username, password ์ ๋ณด๋ฅผ ๋ฐ์ ๋ก๊ทธ์ธํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฐ์
-> 2) ๋ฐฉ์ ์ฑํ
์ปฌ๋ผ ์ด๋ฆ | ์ปฌ๋ผ ํ์ | ์ค๋ณต ํ์ฉ | ์ค๋ช | ์นด์นด์ค ์ฌ์ฉ์ |
id | Long | X | ํ ์ด๋ธ ID(PK) | ํ ์ด๋ธ ID |
username | String | X | ํ์ ID | nickname |
password | String | O | ๋น๋ฐ๋ฒํธ | UUID(๋๋ค ๋ฌธ์์ด) |
String | X | ์ด๋ฉ์ผ ์ฃผ์ | ||
role | String | O | ์ญํ : ์ฌ์ฉ์ - User ๊ด๋ฆฌ์ - Admin |
User |
kakaoId | String(Nullable) | X | ์นด์นด์ค ๋ก๊ทธ์ธ ID | kakaoId |
UUID : ํผ ๋ก๊ทธ์ธ ๋ฐฉ์์ ํผํ๊ธฐ ์ํด์
2. ์นด์นด์ค ๋ก๊ทธ์ธ ์ฌ์ ์์
1) User ์ํฐํฐ
- kakaoId ์ปฌ๋ผ ์ถ๊ฐ
- kakao ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐ๋ ์์ฑ์ ์ถ๊ฐ
- ์นด์นด์ค ์์ด๋ ์ ๋ฐ์ดํธ ๋ฉ์๋ ์ถ๊ฐ
2) UserRepository
- ์ถ์๋ฉ์๋ findByKakaoId(Long id), findByEmail(String email) ์ถ๊ฐ
3) KakaoUserInfoDto : id(kakaoId), email, nickname์ ๋ฐ๋ Dto ์์ฑ
4) KakaoService ์์ฑ : ์์ธ์ค ํ ํฐ ์์ฒญ, ํ ํฐ์ผ๋ก ์นด์นด์ค api ํธ์ถ, kakaoId๋ก ํ์๊ฐ์ , JWT ํ ํฐ ๋ฐํ์ ๊ฐ ๋ฉ์๋์ ๋ก๊ทธ์ธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฐ๊ฒฐํ๋ kakaoLogin ๋ฉ์๋ ์์ฑ
3. ์นด์นด์ค ์ธ๊ฐ์ฝ๋ ๋ฐ๊ธฐ
์ธ๊ฐ์ฝ๋ ์์ฒญ๋ฐฉ๋ฒ :
https://kauth.kakao.com/oauth/authorize?client_id=505ea73b6160cd5b3cb332757130449c&redirect_uri=http://localhost:8080/api/user/kakao/callback&response_type=code
-> URL์ REST API ํค ์ ๋ ฅ
ํ๋ฆ : ์ฌ์ฉ์๊ฐ ์นด์นด์ค ์์ด๋๋ฅผ ํตํ ์๋น์ค ๊ฐ์ ์ ๋์ํ๊ณ ๊ฐ์ ํ๋ฉด Redirect URI(callback)๋ก ์ธ๊ฐ ์ฝ๋ ์ ๋ฌ ํ UserController์์ ์ฒ๋ฆฌ
UserController
- ์ธ๊ฐ์ฝ๋์ HttpServletResponse ํ์ ์ request๋ฅผ ์๋น์ค์ kakaoLogin๋ก ์ ๋ฌ
- ์ฟ ํค ์์ฑ ํ ์ง์ ๋ธ๋ผ์ฐ์ ์ Set (JWT ํ ํฐ์ผ๋ก ๋์ฒด ๊ฐ๋ฅํ ๋ถ๋ถ์ธ๋ฏ)
KakaoService
- ์ธ๊ฐ์ฝ๋๋ก ์ก์ธ์คํ ํฐ ์์ฒญ ๋ฉ์๋ ์์ฑ
Http Header, Body ์์ฑ ํ Http ์์ฒญ ๋ณด๋ด๊ธฐ -> Http ์๋ต์ Json ํํ๋ก ๋ณํ ํ ์ก์ธ์คํ ํฐ ํ์ฑ
- ์ก์ธ์ค ํ ํฐ์ผ๋ก ์นด์นด์ค ์ฌ์ฉ์ ์ ๋ณด ๊ฐ์ ธ์ค๋ ๋ฉ์๋ ์์ฑ
Http Header ์์ฑ ํ Http ์์ฒญ ๋ณด๋ด๊ธฐ
- ์นด์นด์ค ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํ ํ์๊ฐ์ ๋ฉ์๋ ์์ฑ
์ค๋ณต ์์ด๋ ๋ฐ ์ด๋ฉ์ผ ํ์ธ ํ ๊ธฐ์กด ๊ฐ์ ์ : ๊ธฐ์กด ์ ๋ณด์ kakaoId๋์ ์ ๋ณด ์ถ๊ฐ/ ์ ๊ท ๊ฐ์ ์ : ์ ๊ท๊ฐ์
~ User ํ์ ๊ฐ์ฒด ๋ฐํ
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring AOP (0) | 2022.12.28 |
---|---|
ํ ์คํธ ์ฝ๋ (0) | 2022.12.27 |
์คํ๋ง ์๋ จ : Project MySelectShop (3) (0) | 2022.12.15 |
์คํ๋ง ์๋ จ : Project MySelectShop (2) (0) | 2022.12.15 |
์คํ๋ง ์๋ จ : Project MySelectShop (1) (0) | 2022.12.13 |