inflearn logo
강의

Course

Instructor

Spring Boot + React.js Login (+Social) Service Understanding

Token storage

22강 [토큰 저장] 질문

30

Jang Jaehoon

24 asked

0

22강 [토큰 저장]에서 질문이 있습니다.

강의 마지막에 test_admin으로 로그인 한 다음,

관리자 페이지로 이동하면

관리자 권한으로 유저 리스트가 출력되어야 하는데,

그러지 않고 있습니다.

이거 어디서부터 고쳐야하는지요?

DB를 확인해보니, test_admin에 관리자 권한도 있고, 소스 코드로 노션과 강의상의 내용을 구현했습니다만.. (에러 로그로 출력되는 내용도 없습니다.)


1.png


react node.js rest-api spring-boot login

Answer 1

1

neneee

안녕하세요!
첨부해주신 DB 화면을 보면 test_admin의 role은 ROLE_ADMIN으로 정상적으로 들어가 있는 것으로 보입니다.

다만 관리자 페이지의 권한 처리는 DB의 role 값을 직접 확인하는 것이 아니라, 로그인 → Access Token 발급 → JWT 인증 → 권한 확인 → 관리자 API 호출 순서로 이루어지기 때문에 어느 단계에서 문제가 발생하는지 확인해봐야 할 것 같습니다.

우선 아래 내용 한번 확인 부탁드립니다.

  1. test_admin으로 다시 로그인한 뒤 로그인 요청이 정상적으로 200으로 응답되는지

  2. 발급된 Access Token의 payload에 ROLE_ADMIN 권한이 정상적으로 포함되어 있는지

  3. 관리자 페이지로 이동했을 때 개발자도구 Network 탭에서 유저 목록을 가져오는 API 요청이 발생하는지

  4. 해당 요청의 상태 코드가 200 / 401 / 403 중 무엇인지

  5. Request Header에 Authorization: Bearer {AccessToken}이 정상적으로 포함되어 있는지

참고로

  • 401이면 Access Token 전달 또는 JWT 인증 쪽

  • 403이면 권한(ROLE_ADMIN) 처리 쪽

  • 200인데 화면에 출력되지 않는다면 React의 상태 저장/렌더링 쪽
    문제일 가능성이 높습니다.

그리고 첨부해주신 사진에서는 test_admin의 refresh_token이 NULL로 보이는데, 해당 화면이 test_admin 로그인 직후의 DB 상태라면 토큰 저장 로직도 한 번 확인해 주세요.

서버 로그에 에러가 출력되지 않더라도 브라우저 Network 탭에는 401, 403 등의 응답이 표시될 수 있습니다.

확인이 어려우시면 관리자 페이지에서 유저 목록을 요청한 Network 탭의 Request/Response 화면을 캡처해서 올려주세요. 해당 내용을 보면 어느 단계에서 문제가 발생하는지 좀 더 정확하게 확인해드리겠습니다!

0

Jang Jaehoon

답변 감사합니다.

  1. 테스트 어드민 아이디로 정상 로그인 확인했습니다.

test_admin_login.png.webp

0

Jang Jaehoon

  1. 발급된 Access Token의 payload에 ROLE_ADMIN 권한이 정상적으로 포함되어 있는지 --> 이 부분은 로그인 이후 개발자 도구의 [어플리케이션]메뉴에서 억세스 토큰이 쿠키에 저장되었는지 확인 가능한 지의 여부인가요?



0

Jang Jaehoon

관리자 페이지에서 유저 목록을 요청한 Network 탭의 Request/Response 화면

은 로그인한 이후, 브라우저의 개발자 도구에서 [네트워크] 메뉴를 의미하는 건가요?

0

Jang Jaehoon

  1. 발급된 Access Token의 payload에 ROLE_ADMIN 권한이 정상적으로 포함되어 있는지 :정확하게 어디를 확인해야 하는지 모르겠지만.. test_admin으로 로그인하여 발급된 억세스 토큰이 브라우저의 개발자 툴의 [어플리케이션] 메뉴를 통해서 쿠키에 저장되어 있는 것 까지 확인했습니다.


    test_admin_login2.png.webpAccessToken2.png.webp



0

neneee

Application 탭에서 Access Token이 저장된 것을 확인했으므로 로그인 요청과 토큰 발급/저장까지는 정상적으로 처리된 것으로 보입니다.

다만 관리자 페이지에서 유저 목록을 불러오는 것은 로그인 요청과 별도의 API 요청이기 때문에, 해당 요청도 정상적으로 처리되는지는 별도로 확인해야 합니다.

관리자 메뉴를 클릭한 뒤 개발자 도구의 Network → Fetch/XHR에서 새로 발생하는 요청의 Status Code와 Response를 확인해 주세요.

  • 200 → 서버 요청은 정상, 화면 출력 부분 확인

  • 401 → 토큰 인증 부분 확인

  • 403 → 관리자 권한 처리 부분 확인

  • 요청 자체가 없음 → 관리자 페이지의 API 호출 코드 확인

해당 화면을 캡처해주시면 어느 부분을 확인해야 할지 바로 좁혀볼 수 있을 것 같습니다.

그리고,


Access Token 내부의 권한 정보는 https://www.jwt.io 에서 확인할 수 있습니다.

  1. 브라우저 개발자도구 → Application(애플리케이션) → Cookies

  2. accessToken 값을 복사

  3. jwt.io의 JWT Decoder에 붙여넣기

  4. 가운데 Payload 부분을 확인

Payload 안에서 아래와 같은 권한 관련 항목을 찾아주세요.

{
  "role": "ROLE_ADMIN"
}

ROLE_ADMIN이 없거나 ROLE_USER로 들어가 있다면 JWT를 생성하는 부분부터 확인해야 합니다.




0

Jang Jaehoon

test_admin으로 다시 로그인하여 페이로드를 확인해보니, 롤에 관한 부분이 빠져있는 듯 하였습니다. 데이터 베이스에서 롤 설정을 해줘서 그런걸까요?

test_admin_payload.png.webp

0

Jang Jaehoon

로그인 직후 개발자 도구의 Network → Fetch/XHR입니다. 상태코드는 200 인 듯합니다.

Login직후Network.png.webp

0

Jang Jaehoon

그리고 로그인 직후 어드민 페이지로 이동한 상황입니다.

Login직후Admin Page.png.webp

0

Jang Jaehoon

adminPage문제점.png.webp

그리고 어드민 페이지에서 신경쓰이는 부분입니다.

useEffect에서 fetchUser를 가져오는 부분에 노션에서 올리신 코드대로 fetchUser() 라고 코딩하면 에러가 납니다.

그리고 그 아래 줄에서 []에서 무언가 경고 표시가 나오는데,

링크를 클릭해보면, 아래와 같은 내용이 나옵니다.

[ESLint] Feedback for 'exhaustive-deps' lint rule · Issue #14920 · react/react

어제 저녁에 이 내용을 적용해 보려고 시도해 봤는데, 해결은 되지 않은 상태입니다.

1

neneee

추가로 올려주신 화면 확인했습니다.

우선 /admin 주소로 이동하고 Admin page입니다. 화면이 표시되는 것으로 보아 관리자 페이지로의 라우팅 자체는 정상적으로 이루어지고 있습니다.

다만 Network의 Fetch/XHR을 보면 로그인 시 발생한 login(200) 요청 외에 관리자 페이지에서 사용자 목록을 조회하는 API 요청이 발생하지 않고 있습니다.

따라서 현재는 JWT 권한 처리보다 먼저, AdminPage에서 사용자 목록 API를 호출하는 부분을 확인하는 것이 좋을 것 같습니다.

그리고 useEffect의 []에 표시되는 경고는 react-hooks/exhaustive-deps 경고입니다.

예를 들어

useEffect(() => {
  fetchUser();
}, []);

처럼 useEffect 내부에서 fetchUser 함수를 사용하지만 dependency 배열에는 포함되어 있지 않아서 ESLint가 알려주는 경고입니다. 이 경고 자체가 관리자 페이지가 동작하지 않는 직접적인 원인이라고 단정할 수는 없습니다.

다만 말씀하신 것처럼 fetchUser()를 작성했을 때 별도의 에러가 발생한다면 그 부분이 현재 문제와 관련 있을 가능성이 높습니다.

관리자 페이지로 이동했는데 Network에 사용자 목록 조회 요청 자체가 발생하지 않고 있기 때문입니다.

가능하시다면 AdminPage.jsx의 useEffect 부분과 fetchUser() 함수가 정의되어 있는 부분, 그리고 실제 API를 호출하는 부분을 함께 올려주세요. 그 부분을 보면 정확히 어디에서 요청이 막히고 있는지 확인할 수 있을 것 같습니다.

0

Jang Jaehoon

제 AdminPage.jsx의 전체 소스코드입니다.

adminPage소스코드.png.webp

0

Jang Jaehoon

return의 내용에 <li>태그가 중복되는 부분을 하나의 태그로 변경하였습니다. 결과는 그대로인 상태입니다.


import { useEffect, useState } from "react";
import { useNavigate } from "react-router-dom";
import axiosInstance from "../api/axiosInstance";
const AdminPage = () => {
  const [users, setUsers] = useState([]);
  const navigate = useNavigate();
  const fetchUsers = async () => {
    try {
      const res = await axiosInstance.get("/api/admin/users");
      setUsers(res.data); // 사용자 목록 상태에 저장
    } catch (err) {
      console.error("사용자 목록 불러오기 실패 : ", err);
      alert("사용자 정보를 불러오는 데 실패했습니다.");
      navigate("/");
    }
  };
  useEffect(() => {
    fetchUsers;
  }, []);
  return (
    <div className="home">
      <h2>Admin page입니다.</h2>
      <ul>
        {users.map((user) => (
          <li key={user.id}>
            {user.username}({user.role})
          </li>
        ))}
      </ul>
    </div>
  );
};
export default AdminPage;

1

neneee

아래처럼 변경하시면 될 것 같습니다!

fetchUsers; -> fetchUsers();

0

Jang Jaehoon

set-state-in-effect – React

그렇게 하니, 에러가 나오는데, 에러 메시지에 위의 링크가 포함되어 있습니다.

fetchUser() error.png.webp

0

Jang Jaehoon

그리고 어드민 페이지의 문제도 해결되지 않았습니다.

image.png

0

Jang Jaehoon

다시 새로고침도 몇번 시도해 보았지만, 어드민 페이지에서 유저 정보를 가져오지 못하는 문제는 해결되지 않았습니다.

image.png

0

Jang Jaehoon

set-state-in-effect – React 

에러가 나오는데 어떻게 대응하면 좋을까요?

감정일기장 다이어리 필터 적용할때 컨텍스트를 Home에서 가져오는 특별한 이유가 궁금합니다.

0

13

2

Properties 설정이 추가되었는데

0

13

0

강사님 플랜보드 보면서 느끼는건데

0

20

1

아무 수정도 안하고 주어진 소스로 그대로 했는데 패스워드 에러가 남

1

19

1

tdd green agent 에서 문의 드립니다.

0

14

1

[환불 승인 요청] 강의 오결제 및 재구매 관련 문의드립니다.

0

15

1

강의 설명 중에 헷갈리는 것이 있네요

0

15

1

처음 실행 시 계속 패스워드가 틀리다고 나옴. 수정하고 해도 마찬가지임

1

19

2

클로드 사용 오류

0

35

3

음성불량

0

26

1

generateStaticParams() 응용 질문 드립니다.

0

35

2

Mac intel 에서 Homebrew 설치

0

33

1

🔥 [필수] 강의교안 & 소스코드 🔥 링크오류

0

43

2

Context7 버전 관련

0

42

2

깃 초기화?

0

44

2

13강 [로그인 단일 토큰] 에서 프로젝트 실행 시 에러

0

35

1

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

50

2

11강 [실습] Docker로 MySQL1 분만에 실행하기

0

42

2

Composition단계에서 `Layer`는 누가 만드는지

0

32

1

isInterrupted 질문 있다.

0

29

1

카카오 로그인시 401에러

0

268

2

백앤드 쪽 UserController부분

0

103

3

Access Token 30분 오타요..

0

108

1

랜덤 키 생성

1

153

2