개발자
react + 파이어베이스만 써오다가 react + express 조합을 오랜만에 사용중인데 긴가민가한점이있어서 질문드립니다 ㅠㅠ import axios from 'axios'; const instance = axios.create({ baseURL: process.env.REACT_APP_API_BASE_URL, timeout: 2500, headers: { 'Content-Type': 'application/json', withCredential: true, }, }); instance.interceptors.request.use( (config) => { const token = localStorage.getItem('token'); if (token) { config.headers['Authorization'] = token; } else { delete config.headers['Authorization']; } return config; }, (error) => { return Promise.reject(error); } ); export default instance; 이렇게 인터셉터를주어서, 요청할 때마다 토큰을 전달하고있습니다. 그리고 프라이빗 라우터 + 유저정보 인증 훅을 사용해서 로그인사용자만 접근가능하게 페이지를 설정해줬습니다. 근데 질문 1. 네트워크탭 Request Headers 에서 Authorization을 확인해보면 토큰정보가 그대로 노출되고있는데요 원래 이렇게되나요? 질문 2. Bearer + token 이렇게 보내는 경우는 포스트맨이나 이런걸로 테스트할때만 Bearer 을 붙여서 보내주면될까요? 질문 3. 검색 키워드가 생각이안나서 질문으로 올립니다. 아주 옛날에는 (4년전) App.tsx에서 if(localstorage.token){ setAuthToekn(token); } 이런식으로 하고, setAuthToken함수는 import axios from 'axios'; const setAuthToken = (token) => { if (token) { axios.defaults.headers.common['x-auth-token'] = token; } else { delete axios.defaults.headers.common['x-auth-token']; } }; export default setAuthToken; 이런식으로 되어있었는데요, 요즘은 제가 짠 코드처럼 axios.인터셉터 식으로 하는게 맞나요? 질문 4. 그럼 요즘도 회원가입/로그인시 로컬스토리지에 유저 정보 (닉네임 이름 이메일, 토큰정보)만 저장해두고 로그인하면, 로그인버튼이 회원 닉네임으로 변하게 해준다던가.. 이런식으로 분기처리를 하나요? ( 저는 이렇게하고있어서요.. 로딩처리를 줄수도있겠지만 깜빡거리는게 싫고, 또 로컬스토리지로안하면 로그인버튼으로 잠깐바꼇다가 회원닉네임이 표시되더라구요) 질문5. (질문4와 이어집니다.) 만약 질문4처럼하면 사용자가 사이트에 계속 로그인중인데, 이 토큰이 끝났는지 판단하려는 코드를 따로 작성해줘야할까요? 예를들면, App.tsx에 서버 api/auth같은거에 요청보내는 로직을 작성해서, 토큰만보내서 유효한 토큰인지 아닌지, 유효하지않은토큰이면 에러를 리턴시켜준다던가, 리프레쉬토큰을 발급시켜서 연장시켜준다던가 이런식으로하면될까요? 마지막으로 질문이 좀 많고 중구난방인데 죄송스럽고 조심스럽네요..
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 03월 27일
질문 1: 네, 기본적으로 토큰 정보는 HTTP 요청의 헤더에 포함시켜서 서버로 보내게 됩니다. 따라서 네트워크 탭에서 해당 정보를 확인할 수 있습니다. 이런 방식이 보안상 위험하다고 생각할 수 있지만, HTTPS 등을 활용하여 데이터 전송 자체를 암호화하는 방법으로 이러한 문제를 해결합니다. 질문 2: "Bearer"는 토큰 유형을 나타냅니다. 일반적으로 서버가 JWT와 같은 토큰 유형을 검증할 때 사용되는 방법입니다. 따라서 "Bearer"는 실제 코드에서도 추가해줘야 합니다. 질문 3: 네, 맞습니다. 인터셉터를 사용해서 요청 전에 토큰이 있는지 체크하고 설정해주는 것은 좋은 패턴입니다. 질문 4: 로그인 상태와 관련된 정보를 로컬 스토리지에 저장해서 사용하는 것은 일반적인 방법입니다. 하지만 중요한 점은 웹 사이트의 보안성을 위해서 반드시 필요한 데이터만 저장하고, 그 외의 민감한 개인정보나 비밀번호 등은 절대 저장하지 않아야 한다는 것입니다. 질문 5: 이 부분에 대해서는 서버 측에서 토큰의 만료 여부를 체크한 후 그에 따라 응답을 해줘야 합니다. 클라이언트에서는 해당 응답을 받아서 만약 토큰이 만료되었다면 로그인 페이지로 redirect 시키거나 적절한 처리를 해주어야 합니다. 보통은 토큰이 만료되었을 때 새로운 토큰을 생성해주는 refresh token 방식을 사용합니다. 마지막으로 중구난방한 질문이라고 생각하지 않습니다. 많은 개발자들이 가지고 있는 고민 중 하나이며, 이러한 논의와 고민을 통해서 보다 나은 코드와 구조를 생각하고 설계해볼 수 있기 때문입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!