개발자

Next.js에서 클라이언트 컴포넌트와 서버 컴포넌트의 axios interceptor 동기화

2024년 03월 12일조회 1,359

안녕하세요 Next.js 13버전 page router방식으로 개발중입니다. 클라이언트 컴포넌트와 서버 컴포넌트에서의 통신을 위해 각각 axios interceptor를 구현했습니다. 각각 store와 cookie에서 accesstoken값을 헤더에 넣어주는 역할을 하고 있는데 문제가 되는 부분은 토큰 만료 이후 갱신하는 부분입니다. interceptor가 두개이다보니 처음에는 서로 동일한 토큰응 가지고 있지만, 만약 클라이언트 컴포넌트에서 요청시 토큰이 만료되면 갱신하는 요청을 보내고, 서버 컴포넌트에서 요청시 만료되면 갱신하기 때문에 서로 일치하지 않는, 유효한 토큰이 두개가 되는 상황입니다. 현재 서버에서는 유효한 토큰이 하나만 존재하도록 설계를 해놓진 않아서 작동하는데 문제는 없지만 많이 찝찝하네요. 혹시 좋은 방안이 있을까요? 혹은 비슷하게 구현하신 분들의 상황을 공유 받을 수 있을까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 2

인기 답변

이정윤님의 프로필 사진

저는 이렇게 풀었어요 서버 컴포넌트에서 요청 시 엑세스 토큰이 만료가 됐다는 응답(401 등)을 받으면 /auth/refresh?redirect=[원래 요청하려던 url] 로 리다이렉트 시켜서 클라이언트측의 토큰을 리프레시 하고 다시 원래 요청하려던 페이지로 돌아가게 했습니다. 이게 정답인지는 모르겠는데 저는 MVP 단계라.. 나중에 더 좋은 방법 찾으면 바꾸려고 해요.

profile picture

익명

작성자

2024년 03월 15일

오 한번 적용해봐야겠네요. 감사합니다

이정윤님의 프로필 사진

이정윤

소프트웨어 개발자2024년 03월 15일

넵 :) 만약에 더 좋은 방법을 찾게되면 공유 부탁드려요 ㅎㅎ 저도 배우는 단계라 ㅠ

인기 답변

백승훈님의 프로필 사진

안녕하세요 답변 드립니다 😏 먼저 클라이언트 / 서버 를 나눈 이유에 대해서 궁금한 점이 생기내요 특히 page 방식의 경우 CSR로 거의 구성됬을 것 같은데 굳이 서버를 통해야 될 이유가 있을까요? 꼭 서버를 통해야 한다면 굳이 클라이언트에서 백엔드와 직접 통신을 하지않고 모든 통신을 서버 컴포넌트를 경유하면 인터셉터가 하나로 유지될 것 같은데 먼저 클라이언트와 서버를 나눠서 각각 통신해야되는 이유부터 생각해보시는게 맞을 듯 합니다. 혹은 어쩔수 없이 두개를 유지해야 한다면 인증/인가와 토큰에 관련된 부분은 모두 서버 컴포넌트에 위임하고 클라이언트에서 어떠한 통신을 요청시 체크 및 관리를 서버 컴포넌트에서 일괄로 하시면 될 것 같습니다. 웹앱 - 백엔드 웹앱 - 서버리스(Next/api) - 백엔드 지금 이렇게 구성한 상태에서 두개의 통신이 왜 각각 따로 해야할 지에 대해서 조금 생각해보시고 꼭 Next/api의 서버리스를 쓰셔야 되는 이유가 있다면 웹앱 - 백엔드 라인을 전부 웹앱 - 서버리스 - 백엔드로 옴기고 서버에서 서버리스쪽에서 관리를 하는게 통일성이 더 좋을 듯 합니다.

profile picture

익명

작성자

2024년 03월 13일

안녕하세요 답변 감사합니다. 클라이언트와 서버로 나눈 이유는 getserversideprops에서 미리 데이터를 불러 오는 부분은 서버쪽에서, 클라이언트 컴포넌트에서 요청 보낼때는 클라이언트쪽에서 interceptor를 타기 때문에 그렇게 구현했습니다. SSR을 사용하려고 이렇게 구현한것인데 page 방식에서는 CSR만 이용하는게 일반적인가요?

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

데이터를 불러오는 곳이 서버쪽이라면 클라이언트에서 굳이 인증정보다 토큰을 가지지 않아도 되지 않을까요? 백엔드 - 서버리스(Next/api)부분에서 intercepter나 토큰 정보를 넣어서 해당 부분은 서버리스에서 처리하고 클라이언트는 단순히 서버리스에 데이터를 요청 하면 서버리스에서 백엔드와 통신해보고 인증실패/ 통신에러 등을 분류해서 클라이언트에 그냥 내려준다면 굳이 필요하지 않을 것 같은데.. 전체 통신 플로우를 아는건 아니라서 좀 더 확인해보셔야 할 것 같습니다.

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

예) 사과 10개의 정보를 주세요 (클라이언트) -> 서버리스(인증정보 및 헤더를 담고 정제) -> 백엔드 백엔드(인증실패했습니다) -> 서버리스(401및 원하는 에러정보를 담아 전송) -> 클라이언트(실패메세지) 백엔드(재인증해주세요) -> 서버리스(재인증 로직을 통해 백엔드에 재통신) -> 백엔드(인증되었습니다 + 사과 10개의 정보) -> 서버리스(인증정보 보관하고 사과 10개를 통신 성공과 함께 클라이언트에 전송) -> 클라이언트 (사과 10개 정보를 보여줌) 백엔드 (성공 및 사과 10개 정보) -> 서버리스 (성공 및 사과 10개의 정보) -> 클라이언트 (사과 10개의 정보)

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

다만 이전 제가 이런식으로 구현했을 때는 12버전? 인가 13버전이였는데 최근에는 app방식을 밀어주기도 하고 page의 api부분(서버리스)를 다루는 곳이 대격변기라 문법이나 규격도 많이 변하고 지금은 아예 안쓰고 app으로 넘어가려는 움직임이 보여서 .. 저 플로우가 가능할지는 조금 더 해보셔야 할 듯 합니다

profile picture

익명

작성자

2024년 03월 13일

말씀하시는 서버리스가 page/api폴더인가요? 그러면 getserversideprops를 없애고 CSR로 전환하는걸 추천하시는건가요?

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

아.. 제가 뎃글을 잘못봤던거 같내요 서버리스가 아니고 getserversideprops만 사용하시면 미들웨어를 사용해서 통신전 통신후 처리를 넣으시면 될 것 같습니다. https://nextjs.org/docs/pages/building-your-application/routing/middleware#using-cookies 좀 예전에 썻던거라 혼선이 왔내요 위의 링크부분을 참고하시면 될 듯 합니다.

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

이게 저도 아직도 했갈리긴 하는데.. page/api 에서 쓰는 서버리스 펑션도 엄밀히 말하면 SSR입니다. 클라이언트가 아니고 작은 노드 서버에서 실행되는거라 getServerSideProps도 마찬가지로 저런 방식으로 알고는 있는데 서로 통일성있게 조작하고 관리하는게 개인적으로 힘들더라구요.. (중간에 계속 바껴서 찾기도 힘들고 😅) app router 기준으로 좀 많이 개선되어 서버 자체를 컨트롤하기 쉬워졌으니 그쪽이 오히려 더 난거같기도 하고 아직 시기창조인것 같기도 하고..ㅠ

profile picture

익명

작성자

2024년 03월 13일

렌더링 되기전에 getserversideprops에서 데이터 통신도 하고, 렌더링 되고 나서 클라이언트 컴포넌트에서 데이터 통신을 해서 getserversidepros만 사용한다고 보긴 어려울것 같습니다. 미들웨어에서 두 통신 모두 제어가 가능한건가요?

백승훈님의 프로필 사진

백승훈

프론트 엔드 개발자 (FE)2024년 03월 13일

거기까지는 제가 안해봐서 직접 적용해보시고 수정해보시면서 맞춰보셔야 될 것 같습니다. 😅 안되면 통신 플로우를 바꾸던지 다른 방법을 또 생각해봐야겠죠..?

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!