๐Login ๋ฐฉ์
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ธ์ฆ์ ํ์ธํ๋ ๋ฐฉ์์ ์ฟ ํค ์ธ์ ํ ํฐ์ด ๋ํ์ ์ด๋ค.
cookie์ ๊ฒฝ์ฐ์๋ ๋ณด์์ ์ทจ์ฝํ๊ณ ์ฉ๋์ด ์ ํ์ ์ด๋ผ๋ ๋จ์ ์ด ์๋ค.
๊ทธ๋์ ์์ฆ์๋ ๊ฑฐ์ ๋ค jwt ์๋๋ฉด session์ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค ใ ใ
โ Session ๊ธฐ๋ฐ
- ํด๋ผ์ด์ธํธ์ ๋ฏผ๊ฐํ ์ธ์ฆ ์ ๋ณด๋ฅผ ์๋ฒ ์ธก์์ ์ ์ฅ / ๊ด๋ฆฌ
- cookie๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ด๋ฆฌํ๋คโฆ
- ์๋ฒ ๋ฉ๋ชจ๋ฆฌ ์ ์ฅํด๋ ๋๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด๋ ๋๋ค!
Session ์ธ์ฆ ๋ฐฉ์ ์ ๋ฆฌ
- ์ ์ ๊ฐ ๋ก๊ทธ์ธํ๋ฉด ์ธ์
์ ์๋ฒ์ ์ ์ฅ
- session id๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ณด ์ ์ฅํจ
- ์๋ฒ๋ ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค์ session id ์ ์ฅ
- request์์ session id๋ฅผ ์ฟ ํค์ ๋ด์ ์ ์ก
- ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ session id์ ์๋ฒ์์ ๊ฐ์ง๊ณ ์๋ session id๋ฅผ ๋น๊ตํ์ฌ ์ธ์ฆ ์ํ
Session ๊ธฐ๋ฐ ๋ก๊ทธ์ธ / ํ์๊ฐ์ ์ ๋จ์
- ์ธ์ ID๋ฅผ ํ์ทจํ์ฌ ํด๋ผ์ด์ธํธ๋ก ์์ฅํ ์ ์๋ค.
- ์๋ฒ์์ ์ธ์ ์ ์ ์ฅํ๋ฏ๋ก ์์ฒญ์ด ๋ง์ผ๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ์ฌํด์ง
โ ํ ํฐ ๊ธฐ๋ฐ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ ์ ์ ์ ์๋ฒ๊ฐ ํด๋น ํด๋ผ์ด์ธํธ์ ํ ํฐ์ ๋ถ์ฌํ๊ณ , ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ์ด ํ ํฐ์ ๋ค์ ๋ณด๋ด๊ฒ ๋จ.
- ํด๋ผ์ด์ธํธ์ ์ ์ฅ์ด ๋์ด ์ธ์ ๊ณผ ๋ค๋ฅด๊ฒ ๋ถํ๊ฐ ์๊ธฐ๋ ๊ฒ ์์.
ํ ํฐ ์ธ์ฆ ๋ฐฉ์ ์ ๋ฆฌ
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ๊ณ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ํ ํฐ ๋ฐ๊ธ
- ํด๋ผ์ด์ธํธ๋ ๋ฐ๊ธ๋ฐ์ ํ ํฐ์ ์ฟ ํค / ์คํ ๋ฆฌ์ง์ ์ ์ฅํ๊ณ ์๋ฒ์ ์์ฒญ ์ ํด๋น ํ ํฐ์ ํค๋์ ํฌํจ์์ผ ์ ๋ฌ.
- ์๋ฒ๋ ์ ๋ฌ๋ฐ์ ํ ํฐ์ ๊ฒ์ฆํ๊ณ ์์ฒญ์ ์๋ต
- DB ์กฐํํ์ง ์์๋ ๋จ!
ํ ํฐ์ ๋จ์
- ๋ฐ์ดํฐ ๊ธธ์ด๊ฐ ๊ธธ์ด ์ธ์ฆ ์์ฒญ์ด ๋ง์ผ๋ฉด ๋คํธ์ํฌ ๋ถํ๊ฐ ์๊น
- payload๋ ์ํธํํ์ง ์๊ธฐ์ ์ ์ ์ ์ค์ํ ์ ๋ณด ๋ด๊ธฐ ๋ถ๊ฐ
- ํ ํฐ ํ์ทจ ์ ๋์ฒ ์ด๋ ค์
- ์ด ๋๋ฌธ์ ์ฌ์ฉ๊ธฐ๊ฐ ์ ํ์ ๋๊ณ refresh ํ ํฐ์ ๋ฐ๊ธํ๊ฒ ๋จ.
โJWT๊ฐ ๋ํ์ ์ธ ํ ํฐ ์ธ์ฆ ๋ฐฉ์์ด๊ณ ์ฌ๊ธฐ์ ํ ํฐ์ Base64๋ก ์ํธํํ๋ค๋ ์ ์ด ํน์ง์ด๋ค.
๐ ๋ด๊ฐ Session์ ์ ํํ ์ด์
- ์ผ๋จ ์ง๊ธ ๊ฐ๋ฐํ๋ ์ฌ์ดํธ๊ฐ ๋ค์์ ์ฌ์ฉ์๋ค์ด ํ ๋ฒ์ ๋ชฐ๋ฆฌ๋ ์ฌ์ดํธ๊ฐ ์๋๋ผ๊ณ ํ๋จํ์ฌ ์ธ์
์ ์ฌ์ฉํ๋ค.
- ์๋ฒ์ ๋ถ๋ด์ ์ค ์ ๋๊ฐ ์๋๋ผ๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค!
- ๋งค๋ฒ ํ๋ก ํธ์๋์์ JWT ํ ํฐ์ ํค๋์ ๋ด์์ ๋ณด๋ด์ฃผ์ด์ผ ํ๋๋ฐ ๊ทธ๊ฒ ์ฑ๊ฐ์ค ๊ฒ ๊ฐ์์โฆ
๐ KAKAO LOGIN
๐ฟ ํ์๊ฐ์ ๋๋ต์ ์ธ ๊ณผ์
๐ก
- ์ธ๊ฐ์ฝ๋ ์์ฒญ
- ์นด์นด์ค์์ ์ก์ธ์คํ ํฐ ๋ฐ๊ธฐ
- ๋ฐ์ ์ก์ธ์คํ ํฐ์ผ๋ก ์ฌ์ฉ์ ์ ๋ณด ์กฐํ
- ๋ฐ์ ์ฌ์ฉ์ ์ ๋ณด๋ก DB์ ์ ์ฅ
- Session์ ๋ณด๊ด
์ฌ์ค ์ด์ ์ JWT๋ฅผ ์ด์ฉํ kakao ๋ก๊ทธ์ธ์ ๊ตฌํํด๋ดค์ด์ kakao ๊ด๋ จ๋ ๊ฑด ๊ด์ฐฎ์๋ค ใ ใ
๐ ๋ฏ์ค์๋ ๋ถ๋ถ ๋ฑ์ ์ ๋ฆฌ
โจ node.js์์ axios ์ด์ฉ
Spring์์๋ ์ธ๋ถ api๋ฅผ ์ด์ฉํด๋ดค์ง๋ง ๋ ธ๋์์ ์ธ๋ถ api๋ฅผ ์ฌ์ฉํ ์ ์ด ์์๊ธฐ ๋๋ฌธ์ ์ ๋ชฐ๋๋๋ฐ react.js์์ ๋ฐฑ์๋๋ก๋ถํฐ api ์์ฒญํ ๋์ฒ๋ผ axios๋ฅผ ์ด์ฉํ๋ค๋ ์ ์ ์๊ฒ ๋์๋ค.
const tokenResponse = await axios.post(
"<https://kauth.kakao.com/oauth/token>",
null,
{
params:{
"grant_type" : "authorization_code",
"client_id" : KAKAO_REST_API_KEY,
"redirect_uri" : REDIRECT_URI,
code,
},
headers: {
"Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
},
}
);
์ญ์ ๊ฐ์ ๊ณ์ด์ด๋ผ ๊ทธ๋ฐ ๊ฒ ๊ฐ๋คโฆ!
๐ ํ์ ์ฃผ์!!
์ด๊ฑฐ๋ ๋ฏ์ค์๋ ๊ฒ์ ์๋๊ณ ๊ทธ๋ฅ ๋ด๊ฐ ์ค์ํ๋ ๋ถ๋ถ!
const email = userResponse.kakao_account.email;
์ด๋ ๊ฒ email์ ๋ฐ์์ค๋๋ฐ ์๊พธ email ๊ฐ์ด ์ ๋ฐ์์ ธ์ ๋ณด๋๊น ์ ๋ชปํ๊ณ ์์์!!
const email = userResponse.data.kakao_account.email;
์ด๋ ๊ฒ ํด์ผ ์ ์์ ์ผ๋ก ๋์ค๋๋ฐ ใ ใ
๋ฏธ๋ฆฌ ์ฝ์์ ์ฐ์ด๋ณด๊ธฐ๋ง ํด๋ ์๋๋ฐ ์ด๋ฐ ์ค์๋ฅผ ํด์ ํฉ๋นํ๋คโฆ
โจ Session ์ฌ์ฉ
req.session.user = {
"id": user._id,
"email": user.email
};
๋งจ๋ query๋ body๋ง req์์ ๋ฐ์์์ง req์ ์ ์ฅํ๋ ๊ฑด ์ฒ์์ด๋ผ ๋๋ฌด ์ ๊ธฐํ๋ค ใ ใ
const userEmail = req.session.user?.email;
์ฌ๊ธฐ์ ?๋ฅผ ํ์ง ์์ผ๋ฉด ํด๋น ๊ฐ์ด ์์ผ๋ฉด error๊ฐ ๋๋๋ฐ, ?๋ฅผ ๋ถ์ด๋ฉด null๋ก ๋ฐํํ๋ค๊ณ ํ๋ค. ๋ก๊ทธ์ธํ์ง ์์ ์ ์ ํ๋ณ ์์ ์ฉ์ดํ ๊ฒ ๊ฐ๋ค!
components: {
securitySchemes: {
cookieAuth: {
type: 'apiKey',
in: 'cookie',
name: 'connect.sid', // ์ธ์
์ฟ ํค ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ์ด connect.sid)
description: '์ธ์
๊ธฐ๋ฐ ์ธ์ฆ'
},
},
},
security: [
{
cookieAuth: [],
},
],
์ญ์๋ swagger๋ ์ธ์ ์ธ์ฆ์ ์ํ ์ค์ ์ด ํ์ํ๋ค!!
๐ฌ ๋ด ์๊ฐ
๋๊ท๋ชจ ์๋น์ค๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ธ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํธํ๊ธด ํ ๊ฒ ๊ฐ๋คโฆ ๊ทธ๋ ์ง๋ง,, ๋๊ท๋ชจ ์๋น์ค๋ฅผ ๋ค๋ฃฐ ์ ์๋ ๊ณณ์ ์ทจ์ ํ ์ ์๊ธฐ๋ฅผ ใ ใ
console์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ์์ ์ด ์์ฒญ ์ค์ํ ๊ฒ ๊ฐ๋ค
๋ก๊ทธ๋ง ๋จ๊ฒผ์ด๋ ๋ฐ๋ก ๋ฌธ์ ์ ์ด ๋ณด์ด๋๊น ์์ผ๋ก๋ ๋ก๊ทธ๋ฅผ ๊น๋ํ๊ฒ ๋จ๊ธฐ๋ ๊ฑธ ์ฐ์ตํด์ผ๊ฒ ๋ค ๐๐