개발자
Next.Js App router로 개발중입니다. fetch를 이용하여 요청을 보내는 로그인기능을 구현하였는데요. 로그인 성공시 서버로부터 내려받는 access token을 어디다 저장하는게 좋을까요? 다른 fetch 요청들의 header에 access token을 전달해주어야 하는데, 이걸 전달하려면 결국 전역저장하는 방법밖에 없지 않나요? axios를 사용하면 defaults.header로 해결할 수 있지만 Next.Js에서 fetch를 지향한다고 들어서 방법을 알고 싶습니다. ㅠㅠ server action을 사용하는 요청들도 있어서 localStorage같은 저장소에 저장하면 접근조차 안됩니다.
답변 2
브라우저에는 맛있는 쿠키가 있습니다. 서버에서 응답 헤더로 쿠키에 저장해두면 클라이언트에서 별다른 처리 없이 서버로 요청이 가면 서버에서 클라이언트의 쿠키에 접근할 수 있습니다. 또한 서버에서 응답 바디로 토큰을 넣어 클라이언트에서 로컬스토리지에 넣는 방법도 있습니다만 권장되는 방법은 아닌 것으로 알고 있습니다! 쿠키 또는 세션에 넣는 것을 추천드려요. 추가로 만약 쿠키에 저장한다고 했을 때에는 액세스 토큰과 리프레시 토큰을 발급하여 액세스 토큰은 짧은 기간을 두고 리프레시 토큰을 길게 둬서 액세스 토큰이 만료되면 리프레시 토큰을 이용해 액세스 토큰을 재발급 받는 방식이 있습니다. 이러한 이유는 액세스 토큰은 인증 정보가 모두 담겨 있어 오래동안 저장할 경우 탈취됐을 때 위험성이 있기 때문입니다!
김범수
작성자
프론트엔드 독학 • 2023년 12월 19일
access token은 지역변수로, refresh token은 쿠키로 저장하는 것이 권장되는걸로 알고 있긴 한데 access token도 쿠키 저장해도 괜찮을까요? 또한 access token을 지역변수로 저장하고 axios가 아닌 fetch로 요청하면 다른 요청 헤더에 넣는 방법이 없지 않나요 ㅜㅜ 답변 감사합니다!
김태우
zzambbong developer • 2023년 12월 19일
먼저 액세스 토큰도 주로 리프레시 토큰과 함께 쿠키에 저장하는 것으로 알고 있어요! 근데 액세스 토큰을 지역변수로 저장한다는 것이 무슨 의미일까요..?
김태우
zzambbong developer • 2023년 12월 19일
보통 액세스 토큰을 쿠키에 담을 때는 보안 강화를 위해서 httponly와 secure을 설정하기는 합니다! 지역변수에 담는다는 것은 처음 들어봐서 만약 지역변수에 담게 되면 말씀하신 것처럼 다른 요청에서는 사용할 수 없게 되겠죠??
김태우
zzambbong developer • 2023년 12월 19일
다른 방법으론 서버 측의 저장소나 데이터베이스에 저장해서 요청마다 받는 방법도 있기는 합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 12월 19일
Next.js와 같은 클라이언트 사이드에서는 주로 쿠키(cookie) 또는 로컬 스토리지(localStorage)에 토큰을 저장합니다. 하지만, Next.js가 서버 사이드 렌더링(SSR)을 지원하기 때문에, localStorage나 sessionStorage를 사용하면 서버에서는 이 값들을 접근할 수 없어 문제가 생길 수 있습니다. 그래서 이러한 SSR 환경에서는 httpOnly 쿠키를 사용하는 것이 일반적입니다. httpOnly 쿠키는 XSS(크로스 사이트 스크립팅) 공격을 방어할 수 있으며, 서버에서도 접근 가능하므로 SSR 시나리오에 잘 맞습니다. fetch API를 사용하여 요청을 보낼 때는 headers 옵션을 설정하여 JWT 토큰을 포함시킬 수 있습니다. 다음과 같이 fetch 요청 시 headers 객체 안에 'Authorization' 헤더를 포함시키면 됩니다: ```javascript fetch('/api/data', { method: 'GET', headers: { 'Content-Type': 'application/json', // Bearer scheme + your token 'Authorization': `Bearer ${token}` } }); ``` 여기서 token은 저장된 토큰 값을 불러온 것으로, 쿠키에서 추출하는 경우 `js-cookie` 라이브러리의 `get()` 메소드 등을 활용하여 가져올 수 있습니다. 만약 서버에서도 이 토큰값을 사용해야 한다면, 쿠키에 저장하는 것이 좋습니다. Next.js 환경에서는 useEffect 또는 getServerSideProps 등을 이용하여 초기 로딩에 필요한 SSR 처리를 보완하면, CSR 처리와 SSR 처리를 모두 커버할 수 있게 됩니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!