OAuth는 인증을 중개해주는 매커니즘이다. 이미 사용자 정보를 가지고 있는 웹 서비스(네이버, 카카오..)에서 사용자 인증을 대신해주고, 접근 권한에 대한 토큰을 발급해준다.
Resource Owner → 정보 주인Resource Server, Authorization Server → 내 정보를 가지고 있는 서버ApplicationAuthorization Code 단계 추가로 안전성을 높임



export default function Login() {
const CLIENT_ID = "GitHub App에서 발급한 Client ID";
const loginRequestHandler = () => {
return window.location.assign(
`https://github.com/login/oauth/authorize?client_id=${CLIENT_ID}`
);
};
function App() {
const [accessToken, setAccessToken] = useState("");
const getAccessToken = (authorizationCode) => {
axios
.post("http://localhost:4000/callback", { authorizationCode })
.then((res) => {
setAccessToken(res.data.accessToken);
});
}
module.exports = async (req, res) => {
// (6)
try {
const result = await axios({
method: "post",
url: `https://github.com/login/oauth/access_token`,
headers: {
accept: "application/json",
},
data: {
client_id: CLIENT_ID,
client_secret: CLIENT_SECRET,
code: req.body.authorizationCode,
},
});
const accessToken = result.data.access_token;
// (7)
return res.status(200).send({ accessToken });
} catch (err) {
// (8)
return res.status(401).send({ message: "error" });
}
};
useEffect(() => {
if (accessToken) {
// (9)
setIsLogin(true);
}
}, [accessToken]);
useEffect(() => {
axios
//(10)
.post("http://localhost:4000/userInfo", { accessToken })
.then((res) => {
setGithubUser(res.data.githubUserData);
setServerResource(res.data.serverResource);
setIsLoading(false);
});
}, []);
module.exports = async (req, res) => {
const { accessToken } = req.body;
return (
axios
// (11)
.get("https://api.github.com/user", {
headers: {
Authorization: `token ${accessToken}`,
},
})
.then((res) => res.data)
.then((githubUserData) => {
// (13)
res.send({ githubUserData, serverResource });
})
.catch((e) => {
res.sendStatus(403);
})
);
};