인프런 커뮤니티 질문&답변

비오님의 프로필 이미지

작성한 질문수

[리뉴얼] React로 NodeBird SNS 만들기

쿠키 및 서버사이드렌더링 관련 문의드립니다.

21.01.31 18:03 작성

·

623

0

안녕하세요 제로초님! 멘토링했었던 비오입니다. ㅎㅎ

강의 수강 후 개인프로젝트로 sns클론을 만들면서 사용자인증을 세션쿠키방식 대신 토큰방식으로 사용했었는데,

한 번 로그아웃 클릭 시 화면 변경이 없고,  두번 클릭해야만 로그인화면으로 넘어가는 문제때문에 다시 문의드립니다 ㅜㅜ

서버사이드 렌더링쪽에서는 'silent-login'요청을 사용해 리프레시 토큰을 서버에 쿠키로 넘겨주어 로그인을 진행하고,

_app 에서 'refresh' 요청을 사용하여 쿠키에 포함된 리프레시토큰으로 access 토큰을 받아오는 방식으로 구현했어요.

그 후 새로고침 시 로그인이 풀리는 문제는 해결이 되었는데, 여전히 로그아웃 문제가 해결되지 않습니다...

첫번째로 로그아웃 요청을 했을 때 백서버 로그입니다.

logout 요청이 성공 한 후, silent-login(서버사이드렌더링쪽 요청)은 성공해서 로그인창으로 이동하지 않는것 같아요.

(더 정확한 상황을 말씀드리면, 잠깐 로그인 창이 보였다가 로그인된 상태의 메인화면이 보입니다.)

브라우저를 확인 했을 때, 쿠키는 없고, 그래서 refresh 요청은 실패합니다. (silent-login도 실패해야하는데말이죠...ㅠㅠ)

이 상태에서 새로고침을 누를 경우, 로그인창으로 이동합니다.

 서버사이드렌더링쪽에서 context.req.headers.cookie 를 로그찍어보면

로그아웃 이후 여전히 토큰이 존재하는 것으로 나옵니다.

(로그아웃을 한번 더 클릭하면 그 다음번 로그에는 undefined로 뜹니다.)

logout요청 시 브라우저의 쿠키가 삭제되는건 확인했는데, 

왜 프론트서버에서는 쿠키를 보내줄 수 있는걸까요?

답변 6

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 02. 01. 03:10

사용자 정보는 서버사이드렌더링하지 않는 게 가장 좋은 방식인 것 같긴 합니다.

0

비오님의 프로필 이미지
비오
질문자

2021. 01. 31. 22:22

어떻게하면 좋을지 좀더 생각해볼게요. 문제 원인을 못찾으면 코드 구조를 다 바꾸거나 아니면 토큰방식을 일단은 포기해야할거같아요...ㅎㅎㅎ 시간내주셔서 감사합니다.

0

비오님의 프로필 이미지
비오
질문자

2021. 01. 31. 21:21

export const getServerSideProps = wrapper.getServerSideProps(async (context=> {
const cookie = context.req?.headers.cookie;
  console.log(cookie);
  if (context.req && cookie) {
    axios.defaults.headers.Cookie = cookie;
    context.store.dispatch(silentLogin());
    axios.defaults.headers.Cookie = '';
 }

서버사이드렌더링쪽 코드가 쿠키가 있을 때만 silentLogin이 요청되는 구조입니다.

원래 예상대로라면 로그아웃을 눌렀을때, 쿠키가 없어서 if 안에 코드가 실행이 안되는 거였어요.

음 서버사이드렌더링이라서 redux의 state는 사용이 불가능하더라구요.

로그아웃할때 쿠키를 새로 보내주고 그 쿠키가 있는지를 체크해볼까 했는데, 문제가 서버사이드렌더링에서는 직전에 보내준 쿠키를 못받더라구요(쿠키삭제가 안되는것처럼요).

그 다음 실행부터(두번째 로그아웃클릭이나 새로고침 혹은 다른페이지이동) 백서버에서 보내준 요청이 프론트서버에도 적용이 됩니다.

어떻게 코드를 짜야할지 모르겠어요...ㅠㅠㅠ

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 01. 31. 20:20

로그아웃 시에는 slientLogin 안 거치게 코드를 바꿀 수 있을까요?

0

비오님의 프로필 이미지
비오
질문자

2021. 01. 31. 19:30

한번 클릭했을 때  Application -쿠키를 확인해보면 쿠키가 없어요. 

두번째 로그아웃 클릭시 네트워크탭에서 로그아웃api 요청헤더를 확인해보면, 거기에도 쿠키가 없는채로 요청이 갑니다.

첫번째랑 두번째 로그아웃 클릭시 request header입니다.

1 2

음...이게 보편적인 상황은 아닌가보네요 ㅜㅜ 

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

2021. 01. 31. 18:40

로그아웃을 한 번 클릭했을 때 한 번 더 누르기 전에 Application 탭에 쿠키가 있나 바로 확인해보세요.

쿠키가 있으면 그 쿠키를 없애야합니다. 만약 쿠키가 없다면 좀 희한한 상황이긴 한데 두 번째 로그아웃을 클릭할 때 request header에 cookie가 있는지 봐보세요.

비오님의 프로필 이미지

작성한 질문수

질문하기