๋ ธ๋JS๋ก ๊ฐ๋จํ ์๋ฒ๋ฅผ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์ OAuth ๊ธฐ๋ฅ์ ๋ถ์๋ค.
OAuth๋ ๊นํ๋ธ, ๊ตฌ๊ธ, ํ์ด์ค๋ถ ๋ฑ์์ ๋ฐ๊ธํ๋ Access Token
์ ๋งค๊ฐ๋ก ๋ด ์๋น์ค๊ฐ ๊นํ๋ธ ๋ฑ์ ์ ๊ทผํด์ CRUD๋ฅผ ํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค.
Access Token
์ ๋งค๊ฐ๋ก ์ฌ์ฉํ๋ ์ด์ ๋ 1) ์ฌ์ฉ์์ ์์ด๋์ ๋น๋ฐ๋ฒํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ์์ ํ๊ณ , 2) ํ์ํ ์ ๋ณด์๋ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Access Token
์ ๋ฐ๊ธ๋ฐ์ ์ ์๋ค.Access Token
์ ๋ฐ๊ธํ๋ค.โClient๊ฐ ๐Resource Server๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ์ฌ์ ์ ์น์ธ์ ๋ฐ์์ผ ํ๋ค. ์ด๊ฒ์ ๋ฑ๋ก์ด๋ผ๊ณ ํ๋ค.
์๋น์ค(๊นํ, ๊ตฌ๊ธ, ...)๋ง๋ค ๋ฑ๋ก๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค. ํ์ง๋ง ๊ณตํต์ ์ ์๋ 3๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค๋ ์ ์ด๋ค.
Authorization code
๋ฅผ ์ ๋ฌํด์ฃผ๋๋ฐ, Authorized redirect URIs๋ฅผ ํตํด ์ ๋ฌํด์ค๋ค. ์ฆ ์ฝ๋๋ฅผ ์ ๋ฌ๋ฐ๋ ๊ฒฝ๋ก๋ฅผ โClient๊ฐ ์ง์ ํด์ผ ํ๋ ๊ฒ์ด๋ค.OAuth๋ฅผ ํตํด ๐๋ฆฌ์์ค ์๋ฒ์ ์ฌ๋ฌ ๊ธฐ๋ฅ ์ค ํ์ํ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ๊ฒ ํ ์ ์๋ค. ์ด๋ฅผ ์ํด ์ฌ์ฉ์๊ฐ ๋์๋ฅผ ํด์ผ ํ๋ค. ๋์๋ ๊นํ๋ธ ํ๋ฉด์ ํด๋ฆญ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
'๊นํ๋ธ๋ก ๋ก๊ทธ์ธํ๊ธฐ' ๋ฒํผ์ URL์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค. ์๋ฒ API๋ฅผ ํตํด์ ๋ฆฌ๋๋ ์ ํ๋๋ก ํ๋ค. private API key๋ฅผ ๋ฆฌ์กํธ์ ์ ์ฅํ๋ฉด ๋ณด์์ ์ทจ์ฝํ๊ธฐ ๋๋ฌธ์ ์๋ฒ๊ฐ ๊นํ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋๋ก ํ๋ค.
// express์ index.js
app.get("/api/users/github/start", (req, res) => {
res.redirect(`https://github.com/login/oauth/authorize
?client_id=${process.env.CLIENT_ID}
&redirect_uri=${process.env.REDIRECT_URL}`);
});
// ๋ฆฌ์กํธ์ LoginPage.js
const goToLoginUrl = () => {
window.location.href = "/api/users/github/start";
};
๐ ๋ฆฌ์์ค ์ค๋๊ฐ ๐๋ฆฌ์์ค ์๋ฒ๋ก ์ ์ฃผ์๋ฅผ ํตํด ์ ์ํ๊ฒ ๋๋ฉด ๐๋ฆฌ์์ค ์๋ฒ๋ ๐ ๋ฆฌ์์ค ์ค๋๊ฐ ํ์ฌ ๋ก๊ทธ์ธ๋์ด ์๋์ง ํ์ธํ๋ค. ๋ก๊ทธ์ธ์ด ์๋์ด ์์ผ๋ฉด ๋ก๊ทธ์ธ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค.
๋ก๊ทธ์ธ์ด ๋์์ผ๋ฉด, ๐๋ฆฌ์์ค ์๋ฒ๋ URL๋ก ๋ฐ์ Client ID์ ์์ ์ด ๊ฐ์ง๊ณ ์๋ Client ID๋ฅผ ๋น๊ตํด ๊ฐ์์ง ํ์ธํ๋ค.
๊ทธ ๋ค์ redirect_uri๋ฅผ ๋น๊ตํ๊ณ ๋ค๋ฅด๋ฉด ์ฌ๊ธฐ์ ์์
์ด ๋๋๋ค. ๊ฐ๋ค๋ฉด ๐
๋ฆฌ์์ค ์ค๋์๊ฒ scope
์ ๋ํ ๊ถํ์ โClient์๊ฒ ๋ถ์ฌํ ๊ฒ์ธ์ง ํ์ธํ๋ ํ๋ฉด์ ๋ณด์ฌ์ค ํ ๐
๋ฆฌ์์ค ์ค๋๊ฐ ํ์ฉ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๐๋ฆฌ์์ค ์๋ฒ๋ ํด๋น ์ ์ ์ user id
์ scope
, Authorization code
๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ ์ฅํด ๋๋๋ค.
๐๋ฆฌ์์ค ์๋ฒ๋ Client ID
์ Authorized redirect URIs
๋ง ์ผ์นํ๋ค๊ณ ํด์ Access Token
์ ๋ฐ๋ก ๋ฐ๊ธํ์ง ์๋๋ค. ์์ง Client Secret
์ ์ฌ์ฉํ์ง ์์๋ค!
๐๋ฆฌ์์ค ์๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ์ฝ์ํ Authorized redirect URIs
์ Authorization code
๋ฅผ ๋ด์์ ๐
๋ฆฌ์์ค ์ค๋์๊ฒ ์ ์กํ๋ค.
๋ฆฌ๋๋ ์
HTTP ๋ฉ์์ง๋ Location
์ ํค๋๋ก ํ๋ค. Location ํค๋๋ ํ์ด์ง๋ฅผ ๋ฆฌ๋๋ ์
ํ URL์ ๋ํ๋ธ๋ค. โClient์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ฆฌ๋๋ ์
์ค์ ํURL?code=์ด์๋ผ์ด์ ์ด์
์ฝ๋
๋ก ์ด๋ํ๋ผ๋ ์์ฒญ์ด๋ค.
์ด ์์ฒญ์ ์ํด ์ด๋์ด ๋๋ฉด ์ ์ฌ์ง์ฒ๋ผ โClient๋ ๐
๋ฆฌ์์ค ์ค๋์ Authorization code
๋ฅผ ๊ฐ๊ฒ ๋๋ค.
โ
โ
โ
โ
โ
์ด์ ์ด Authorization code
๋ฅผ ๊ฐ์ง๊ณ โClient๋ ๐๋ฆฌ์์ค ์๋ฒ์ ์ง์ ํต์ ํ๋ค.
๋จผ์ ์๋ฒ๋จ์์ Github๋ก๋ถํฐ Access Token
์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํ API๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
์์ฑํ API URL ๋ค์ Authorization code
๋ฅผ ๋ด์์ ์๋ฒ๋จ์ ๋ณด๋ด๋ฉด, Back-End์์๋ ๋น๋๊ธฐ ํต์ ์ผ๋ก Github์ Access Token ๋ฐ๊ธ์ ์์ฒญํ๋ค. Authorization code
๋ Front-End์์ ์ฝ์ด๋ค์ธ๋ค.
์ด๋ ๋ณด๋ด์ผ ํ๋ ์ ๋ณด(Client ID
, Client Secret
, Authorization code
)๋ ๋น๋๊ธฐ ํต์ API URL์ ๋ด์์ ๋ณด๋ธ๋ค. ํค๋๋ ํ์๋ก ๋ฃ์ด์ผ ํ๋ค.
// express์ index.js
app.get("/getAccessToken", async (req, res) => {
const params = `?client_id=${process.env.CLIENT_ID}&client_secret=${process.env.CLIENT_SECRET}&code=${req.query.code}`;
await axios
.post(
"https://github.com/login/oauth/access_token" + params,
{},
{
headers: {
Accept: "application/json",
},
}
)
.then((fromGithub) => {
res.status(200).json(fromGithub.data);
});
});
// ๋ฆฌ์กํธ์ LoginPage.js
useEffect(() => {
const queryString = window.location.search;
const paramFromURL = new URLSearchParams(queryString);
const codeFromParam = paramFromURL.get("code");
// ๋ก์ปฌ์คํ ๋ฆฌ์ง
if (codeFromParam && localStorage.getItem("githubAccessToken") === null) {
getAccessToken();
async function getAccessToken() {
await axios
.get(
`http://localhost:5000/getAccessToken?code=${codeFromParam}`,
{}
)
.then((res) => {
if (res) {
window.localStorage.setItem(
"githubAccessToken",
JSON.stringify(res.data.access_token)
);
setRerender(!rerender);
}
});
}
}
}, []);
๐๋ฆฌ์์ค ์๋ฒ(Github)๋ URL๋ก ์ ์ก๋ฐ์ Authorization code
๋ฐ Client Secret
๋ฑ์ด ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ์ ๋ชจ๋ ์ผ์นํ๋์ง ํ์ธํ๋ค.
๋ชจ๋ ์ผ์นํ๋ค๋ฉด ๐๋ฆฌ์์ค ์๋ฒ์ โClient๋ Authorization code
๋ฅผ ์ง์ด๋ค(๋ ๋ค์ ์ธ์ฆํ์ง ๋ชปํ๋๋ก ์ญ์ ).
์ด์ ๐๋ฆฌ์์ค ์๋ฒ๋ Access Token
์ ๋ฐ๊ธํ๊ณ โClient์๊ฒ ๋ณด๋ด์ค๋ค. โClient๋ ํ ํฐ์ ์ ์ฅ์์ ๋ณด๊ดํด๋๊ณ ํ์ฉํ ์ ์๊ฒ ๋๋ค.