클론 사이트: Brunch
진행기간: 4월 18일 - 4월 30일
front-end : 아점프론트깃허브
back-end: 아점백깃허브
시연영상: 아점시영영상
브런치를 선택하게 된 이유는 간단했다. 깔끔한 UI였다. 팀원들 각자 하고 싶은 사이트를 2개씩 골라와 결정하기로 했다. 내 마음은 원래 중고 판매사이트 Kream이였지만, 세련된 브런치 UI를 보고 마음을 바꿨다.
내가 이 코드를 공유하고 싶은 이유는 그냥 처음해봐서여다. 엄청 잘 짠 코드도 아니다. 하지만 나름의 도전이었기에 공유하고 싶다.
<div className={styles.kakaologinBox}>
<Button href={KAKAO_AUTH_URL} kakao>
<img
src={process.env.PUBLIC_URL + '/image/kakaotalk.png'}
alt=""
/>
카카오로 계정 시작하기
</Button>
</div>
const code = new URL(window.location.href).searchParams.get('code');
const bodyData = {
grant_type: 'authorization_code',
client_id: REST_API_KEY,
redirect_uri: REDIRECT_URI,
code: code,
client_secret: CLIENT_SECRET,
};
const queryStringBody = Object.keys(bodyData)
.map(k => encodeURIComponent(k) + '=' + encodeURI(bodyData[k]))
.join('&');
useEffect(() => {
fetch('https://kauth.kakao.com/oauth/token', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
},
body: queryStringBody,
})
.then(res => res.json())
.then(data => {
Kakao.init(KAKAOINIT);
sendData(data);
});
}, [Kakao, queryStringBody]);
카카오톡 소셜 로그인을 하기로 했다면, 인가코드를 가장 먼저 받아야한다. 사이트 내에서 카카오톡 로그인 후, 내 애플리케이션에서 Rest-api-key와 redirect_uri 키를 받아 볼 수 있다. 그 다음 카카오톡에게 인가코드를 달라고 요청을 해야한다. Auth.js의 제일 상단 const code가 바로 인가코드이다.
카카오로부터 액세스 토큰 받기
카카오 개발자 문서에서 인가코드는 시작일뿐, 액세스 토큰을 받고 넘겨줘야 로그인을 할 수 있다는 글이 적혀있었다. 프론트, 카카오, 백엔드 사이에서 무엇이 오고가야하는지 이해가 제대로 되지 않은 상태에서 시작하다보니, 나는 무엇을 받고 넘겨줘야하는지 헷갈렸고, 긴 삽질의 시간을 가졌다.
내가 이해한 바는 바로 아래와 같다.
“카카오야! 클라이언트가 우리사이트에서 카카오로 로그인 했거든! 니네 카카오에 해당 클라이언트 정보 있니? 인증해줘! 내가 너한테, Client_id, redirect_uri, code, client_secret를 post 형식으로 request 날릴게!
클라이언트 인증되면 너는 res로 access token 주렴!안되면 error로 날려!”
access-token을 받는 과정도 순탄치 않았다. 나는 계속해서, parameter를 json형태로 보내고 있었고, 카카오문서에서는 분명 type=string으로 보내라고 했는데, 그 부분을 제대로 인지하지 못했다... 왜 자꾸 invalid_client KOE010 에러만 보내주는거지? ...아...json (이 부분을 캐치하고 함께 고쳐준 팀원분들께 ㅜㅜ넘나 감사해요) 다시 string 형태로 보내주자 카카오로부터 access token을 받을 수 있었다. 감격의 눈물!!!
const sendData = async data => {
await fetch('http://localhost:8000/user/login', {
method: 'post',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
})
.then(res => res.json())
.then(res => {
if (!res.token) return;
localStorage.setItem('token', res.token);
navigate('/');
window.scrollTo(0, 0);
});
};
프론트에서 access token을 백에게 보내주면서 req를 날린다. (백엔드, access-token 줄테니까 아점 토큰만들어서 줘요!)
이후는 백엔드의 영역이다. 백엔드는 다시 한번 카카오에게 요청을 날린다.
“카카오! 프론트한테 access-token 받았다. 이제 우리가 원하는 해당 클라이언트 정보 보내줘!!!”
백엔드는 카카오에서 받은 정보를 API로 만든다. 프론트가 요청한 Token을 res로 보내주면 끝!
처음 해본 소셜 로그인은 사실 쉽지 않았다. 정했던 스케쥴보다 지체되었고, 고생도 많이 했다.그렇지만 해내서 너무나 뿌듯하다! 프로젝트하면서 내 스스로에게 아쉬웠던 점을 보완하고, 팀원들에게 본받았던 점을 잊지 않고 내 것으로 만들어야겠다. 기업협업에서 꼭 실천하자!