inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

타입스크립트로 배우는 Next.js 16+ 완전 정복 : 기초부터 최신 아키텍처까지

카카오 로그인 구현하기 - 2

JWT auth error invalid token

3

태리바이트

작성한 질문수 4

0

image.png

이메일 입력 후 contitnue 버튼을 누르면 JWT auth error invalid token 오류가 나네요. 몇시간째 보고 있는데 원인을 찾지 못하겠네요. 전체 소스 코드를 같이 첨부하고 싶은데 할 수 가 없네요. 일단은 EmailInfoForm 소스만 올려 봅니다.

backend는 .env 빼고 소스를 특별하게 수정한 부분이 없습니다.

브라우저 application 데이터도 클리어 해보고 했지만 소용이 없네요. 확인 부탁드립니다.

"use client";

import {useState} from "react";
import {MailIcon} from "../ui/Icons";
import {validateEmail} from "@/lib/validation";
import clientApi from "@/lib/api/clientApi";
import {useRouter, useSearchParams} from "next/navigation";

export default function EmailInfoForm() {
  const router = useRouter();
  const searchParams = useSearchParams();
  const accessToken = searchParams.get("access_token") ?? "";
  const [email, setEmail] = useState("");
  const [error, setError] = useState("");
  const [isSubmitting, setIsSubmitting] = useState(false);
  const handleFormSubmit = async (e: React.SubmitEvent<HTMLFormElement>) => {
    e.preventDefault();
    if (isSubmitting) return;

    setError("");
    //이메일 검증
    const validationError = validateEmail(email);

    if (validationError) {
      setError(validationError);
      return;
    }

    //확인 대화 상자
    const confirmed = window.confirm(
      "한 번 입력한 이메일은 변경할 수 없습니다. 이 이메일로 저장할까요?",
    );

    if (!confirmed) return;

    setIsSubmitting(true);

    try {
      const res = await clientApi("/auth/update-email", {
        method: "PATCH",
        body: JSON.stringify({email: email.trim()}),
        headers: {
          Authorization: `Bearer ${accessToken}`,
        },
      });

      if (!res.ok) {
        const errorData = await res.json().catch(() => null);
        throw new Error(
          (errorData && errorData.error) || "이메일 업데이트에 실패하였습니다.",
        );
      }

      router.replace("/");
      router.refresh();
    } catch (e) {
      setError(
        e instanceof Error ? e.message : "이메일 업데이트에 실패하였습니다.",
      );
    }
  };

  return (
    <>
      <form className="flex flex-col gap-5" onSubmit={handleFormSubmit}>
        <div className="flex flex-col gap-2">
          <label
            htmlFor="email"
            className="text-sm font-medium text-foreground"
          >
            Email Address
          </label>
          <div className="relative">
            <MailIcon className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
            <input
              id="email"
              type="email"
              placeholder="Enter your email"
              className="h-11 w-full rounded-lg border-none bg-secondary pl-10 pr-4 text-sm text-foreground placeholder-muted-foreground outline-none focus:ring-2 focus:ring-primary"
              value={email}
              onChange={(e) => setEmail(e.target.value)}
            />
          </div>
        </div>

        {error && (
          <p className="text-sm font-medium text-destructive">{error}</p>
        )}

        <div className="grid grid-cols-2 gap-3">
          <button
            type="button"
            className="h-11 rounded-lg bg-secondary text-sm font-medium text-secondary-foreground transition-colors hover:opacity-90"
          >
            Cancel
          </button>
          <button
            type="submit"
            className="h-11 rounded-lg bg-primary text-sm font-medium text-primary-foreground transition-colors hover:opacity-90"
          >
            Continue
          </button>
        </div>
      </form>
    </>
  );
}

javascript react typescript next.js jwt

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 태리바이트님.

JWT 인증 오류 “유효하지 않거나 만료된 토큰입니다”는 보통 토큰이 만료되었거나, 유효하지 않은 경우에 발생합니다. 이런 문제를 해결하기 위해 다음을 점검해 보시기 바랍니다:

  1. 토큰 유효성 확인:

    • 서버에서 발급받은 토큰의 유효시간(expiration)이 경과한 경우인지 확인해 보세요. 만료된 토큰은 항상 “유효하지 않거나 만료된 토큰” 오류를 유발합니다.
  2. 토큰 전달 방식 점검:

    • 클라이언트에서 서버로 요청할 때 Authorization 헤더에 Bearer 토큰이 제대로 설정되었는지 확인하세요. Authorization: Bearer ${accessToken} 형식이 맞는지 재확인하세요.
    • 만약 accessToken이 빈 문자열이거나 잘못된 값이라면, 올바른 과정으로 토큰을 받아오는지 점검해 보세요.
  3. 브라우저 캐시와 스토리지 초기화:

    • 이미 시도하신 것처럼 브라우저의 애플리케이션 데이터를 클리어한 후, 다시 시도해 보세요.
  4. 서버 로그 확인:

    • 백엔드 로그를 확인하여, 클라이언트의 요청에 대해 어떤 오류가 발생했는지 구체적인 정보를 얻어보세요. 특히, JWT 인증 모듈에서 어떤 오류 메시지를 반환하는지 중요합니다.
  5. 환경 설정 점검:

    • .env 파일에서 민감한 정보들이 올바르게 설정되어 있는지 중요합니다. JWT 발급과 관련된 정보(시크릿 키 등)가 올바른지 점검하세요.

이 문제는 대부분 토큰의 유효성 문제이므로, 위의 점검 사항들을 하나씩 확인하시면 해결에 가까워질 것입니다.

혹시 유사한 문제가 있었던 질문과 답변이 있다면 다음 링크를 참조해 보세요:
- [JWT 토큰 문제 해결법]
- [JWT와 인증 관련 일반적인 오류]

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

태리바이트

원인을 찾았습니다. } 오타가 하나 더 들어가 있었네요...

redirect(`/login/email-info?access_token=${access_token}}`);

강의 소스코드 질문드려봅니다

0

18

0

cursor 버전을 뭐을 써야하나요?

0

12

1

테마맵 만들기 위해.

0

10

1

15강 git 설정 오류

0

15

1

4강 영상문제

0

18

1

루프 개념

0

21

1

/todos 옵션

0

18

1

경력기술서는 어떤 방향이 좋을까요?

0

14

2

74. 데이터 캐시 - 1 (이론) 강의 영상 누락

0

66

1

lucide react 아이콘 설치

0

85

2

02-04 layout.tsx 구조가 달라요

0

94

2

10-6 실습 할 수 없습니다..

0

112

1

그림 예제는 따로 제공이 안되나요?

0

91

1

cacheLife에 대한 질문입니다

0

86

1

(제보) 쿠키를 브라우저 개발 환경에서 직접 삽입했을 때 나오지 않는 현상

0

92

2

디스코드 채널 초대 링크

0

116

1

revalidatePath 질문 있습니다.

0

93

2

MainLayout이 중첩되어 뜨는 문제

0

96

2

쿠키와 헤더

0

80

2

구지 react를 사용하는 이유가 그럼 있는가?

0

99

1

FormEvent가 deprecated 되었다고 합니다.

0

411

2

터보백이 안보입니다

0

80

2

젯브레인 웹스톰(jetbrains webstorm) 사용하시는 분들 참고

0

138

2

소스 코드 다운로드는 어디서 하나요.

0

96

2