• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 React 게시판 JWT 토큰을 이용한 로그인 방식

JWT 토큰을 이용한 로그인 방식

6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 글쓴이
  • #68376
    팀 프로젝트를 하다가 이제 로그인을 구현하고 있습니다.
    JWT 토큰 방식을 이용해서 액세스 토큰은 로컬 스토리지, 리프레시 토큰은 HTTP only 쿠키에 보관하기로 했고 
    각각 저장에는 성공한 것 같습니다. (HTTP only 쿠키는 조회가 안돼서 아직 어케 된지 확인이 안되는 상태)
    
    여튼 로그인에 성공하면 이제 서버에서 액세스 토큰과 리프레시 토큰을 발급해주잖아여
    근데 액세스 토큰이 AAA.BBB.CCC로 구성되어 있고 그 중 AAA, BBB 부분은 단순 Base64 인코딩이 된거더라고요.
    이를테면 BBB를 뜯었을 때 sub(유저명), iat(발급시간), exp(만료시간) 등등 여러 정보들이 나오던데
    그러면 클라이언트 단에서는 액세스 토큰 JWT의 두 번째 부분을 파싱해서
    유저의 이름과 액세스 토큰의 유효기간을 분석해서 화면에 띄워주는 건가요?
    
    예를 들자면 네비바 우측 상단에 로그인 / 회원가입 카테고리가 있는데, 
    로그인에 성공해서 갓잡은 싱싱한 액세스 토큰이 로컬 스토리지에 있는 걸 확인한다면
    로그인 / 회원가입 → (로그인한 유저 이름) / 로그아웃... 이런 식으로 바꾸게 하고 싶은데, 
    이 때 로그인한 유저의 이름은 로컬 스토리지 액세스 토큰을 확인하고 띄워주는 게 맞는 지 궁금합니다.
    
    #68423

    codingapple
    키 마스터
    그래도 되는데 디코딩 귀찮고 오래걸려서
    그냥 유저 이름이나 로그인여부같은건 로컬스토리지에 따로 저장해서 쓰면 편합니다
    #68436
    어쩐지 이런 방식으로 사용하는 건 권장하지 않는다고 구글에서 나오길래 어케해야 하나 싶었습니다..
    1. 처음 로그인 성공 후 로그인 유지를 어떻게 시키는 지?
    처음 로그인에 성공하면 서버에서 응답코드 200 날려주고
    data.data에 토큰을 담아 보내주는 것 이외에는 다른 동작이 없습니다.
    그렇다면 어떻게 프론트 단에서 로그인 여부를 검증하는가요?
    액세스 토큰이 유효한 지 검사하는 API를 거쳐서 (아직 이런거 없음 만약 필요하다면 만들어야 함)
    이게 유효하다고 나오면 로그인을 유지시키는 방식인가요?
    2. 토큰 파싱을 하지 않는다면 유저의 정보(로그인 유무, 유저 이름 등)를 어떻게 따로 빼서 저장하는지?
    그리고 토큰 파싱을 하지 않는다면 유저 이름은 백 쪽에서 API를 하나 만들어
    그 API에 액세스 토큰을 제시하고 거기서 받아온 값을 로컬 스토리지에 저장하는 게 일반적인가요?
    3. 만약 그럴 경우 지금 제가 이해한 내용이 맞는지
    일반적인 로그인 과정 (이게 제일 헷갈림)
    1) 로그인 폼에 아이디, 비밀번호 입력 후 전송
    2) 등록된 사용자인 경우 서버에서는 응답코드 200과 함께 액세스/리프레시 토큰 담아줌
    3) 프론트에선 먼저 액세스 토큰과 리프레시 토큰을 각각 저장하기로 한 장소에 저장함
    4) 전달받은 액세스 토큰을 액세스 토큰 유효 검증 API에 보냄
    5) API에서는 유효 유무, 유저 이름와 토큰 만료 시간(?) 등을 반환
    6) 유효한 지 확인이 되었다면 그 유저의 이름과 로그인 상태는 로컬 스토리지에 저장
    7) 로컬 스토리지의 로그인 상태를 useEffect로 엮어서 로그인 상태가 Y인 경우 
    로그인 상태가 Y일때 나오는 화면구성으로 전환(예를 들어 로그인 → 로그아웃 / 회원가입 → 마이페이지 등)
    액세스 토큰 만료 시 거치는 과정
    1) 마이페이지 접근 시 유효한 액세스 토큰을 받아야 유저의 상세 정보를 반환해주는 API가 있다고 가정
    2) 현재 액세스 토큰은 만료되었고 리프레시 토큰은 유효기간이 남아있는 상태
    3) 그런 상황에서 마이페이지에 접근했을 때 서버에서는 유효하지 않은 액세스 토큰이므로 빠꾸처리
    4) 빠꾸 받았을 경우 일단 액세스 토큰 연장 요청 API에 가서 연장받게끔 처리함
    5) 토큰 재발급 API에서는 유효한 리프레시 토큰을 받았으므로 액세스 토큰을 새로 발급해줌.
    6) 다시 마이페이지 접근, API는 유효한 액세스 토큰을 받았으므로 유저의 정보를 정상적으로 출력
    (이게 마이페이지 한 번 클릭했을 때 일어나는 일련의 과정)
    리프레시 토큰 만료 시 거치는 과정
    1) 위와 똑같이 마이 페이지에 접근하려고 하는 상황. 그런데 이번엔 리프레시 토큰도 만료됨.
    2) 마이페이지 접근 시 액세스 토큰 만료되었으니 빠꾸시킴
    3) 그래서 액세스 토큰 재발급 API에 접근했으나 이번엔 리프레시 토큰도 만료됨. 역시 빠꾸
    4) 액세스 토큰 재발급에서도 빠꾸를 받았으니 프론트에서는 특정 경고창과 함께 로그아웃 처리
    5) 로컬 스토리지에 있는 로그인 상태는 N, 액세스 토큰은 삭제 처리
    #68458

    codingapple
    키 마스터
    다맞는말입니다
    액세스토큰 보내줄 때 그냥 유저정보도 같이 보내주면 편리하지않을까요 
    프론트엔드에선 어짜피 다 위조가능한데 굳이 검사하고 그럴 필요 없습니다 서버에서 중요한 데이터 입출력할 때만 서버에서 유저로그인 검사하면 됩니다
    #68588
    쓰앵님 말씀대로 서버에서 로그인 성공 시 API에서 유저 정보를 수신할 수 있도록 해서 얼추 구현은 완료됐습니다.
    문제는 다른 데에서 또 생겼는데요, HttpOnly 쿠키에 담긴 리프레시 토큰과 관련해서 문제가 생겼습니다.
    
    액세스 토큰이야 로컬 스토리지에 저장해서 서버 API의 Required가 액세스 토큰일 경우에
    로컬 스토리지에 담긴 액세스 토큰을 꺼내서 axios.get('url', { headers : { Authorization : `Bearer ${액세스토큰}` } }) ...
    이런 식으로 요청을 하면 되는건데
    
    리프레시 토큰은 서버에서 보낼 때 쿠키 헤더에 넣어서 자동으로 HttpOnly 쿠키에 집어넣는 방식이고
    그걸 클라이언트 단에서는 건드릴 수가 없으니(js로 조작 불가)
    액세스 토큰 재발급 요청 API에 리프레시 토큰을 제출해야 하는 상황에서 어떻게
    HttpOnly 토큰을 보내야 하는 지 궁금합니다.
    저것도 쿠키니까 수신만 잘 되어있으면 POST 요청할 때 별도로 건드릴 필요없이
    요청만 하면 알아서 서버가 잘 받아오는 구조인건가요?
    
    또 하나 문제가 더 있는데 일단 로그인에 성공했을 때 res.data.data에 액세스 토큰이 담겨오는 것은 확인했지만
    HttpOnly 쿠키는 개발자도구 → 애플리케이션 탭에서 쿠키 조회를 해봐도 보이지가 않습니다.
    검색해보니 HttpOnly 쿠키는 브라우저에서 안 보일 수 있다고는 하는데
    다른 사이트들 쭉 돌아다녀보니 HttpOnly 쿠키는 그냥 옵션에 체크가 되어있고 키-값이 다 보이더라구요?
    그러면 수신이 제대로 안되고 있다는 얘기도 되는데.... 이걸 또 어떻게 확인해야 하는지 궁금합니다.
    
    현재 만들고 있는 사이트가 http://로만 통신하고 있어서 문제가 생긴건지
    아니면 CORS 관련해서 서버에서 뭔가를 좀 더 설정을 해줘야 하는 게 있는지 감이 잡히지가 않네요
    현재 서버에서는 Set-Cookie : refreshToken=리프레시토큰내용; path=/; 
    Max-Age=604900; expires=만료날짜; HttpOnly; SameSite=None으로 되어있는 상태입니다.
    어째 통신쪽 들어오면서부터 난이도가 급상승하는 것 같네요 아오
    #68601

    codingapple
    키 마스터
    쿠키는 자동으로 갑니다 refresh token 매번 보내기 싫으면 특정쿠키는 /어쩌구 로 요청할 때만 보내라고 path 설정할 수도 있는데
    JWT 거절당할 때 headers에 넣어서 보내는것도 좋아보입니다  
    서버랑 프론트랑 주소가 다르면 cors설정을 찾아봅시다
6 글 보임 - 1 에서 6 까지 (총 6 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠