해결된 질문
작성
·
78
·
수정됨
0
알려주신데로 UserControllerV1.java에 어노테이션 추가하고 재기동한 뒤 검색 했는데...로그에
com.auth0.jwt.exceptions.JWTDecodeException: The token was expected to have 3 parts, but got 1.
이런 에러가 나옵니다.ㅠㅠ
개발자 도구에는 아래와 같은 에러가 나옵니다.
UserControllerV1.java는 이렇게 작성되어 있습니다.
어떤 부분을 더 확인해야 하는지, 어떤 부분이 문제 인건지 확인 부탁드립니다.ㅠㅠ
**추가로 에러내용 전체입니다.
com.auth0.jwt.exceptions.JWTDecodeException: The token was expected to have 3 parts, but got 1.
at com.auth0.jwt.TokenUtils.splitToken(TokenUtils.java:21)
~[java-jwt-3.12.0.jar!/:3.12.0]
at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:36) ~[java-jwt-3.12.0.jar!/:3.12.0]
at com.auth0.jwt.JWTDecoder.<init>(JWTDecoder.java:32) ~[java-jwt-3.12.0.jar!/:3.12.0]
at com.auth0.jwt.JWT.decode(JWT.java:45) ~[java-jwt-3.12.0.jar!/:3.12.0]
at com.example.demo.security.JWTProvider.decodedJWT(JWTProvider.java:109) ~[!/:0.0.1-SNAPSHOT]
at com.example.demo.security.JWTProvider.getUserFromToken(JWTProvider.java:123) ~[!/:0.0.1-SNAPSHOT]
at com.example.demo.domain.user.controller.UserControllerV1.searchUser(UserControllerV1.java:43) ~[!/:0.0.1-SNAPSHOT]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.1.13.jar!/:6.1.13]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.1.13.jar!/:6.1.13]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:384) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.30.jar!/:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.30.jar!/:na]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
답변 2
0
안녕하세요 cloverj0님 질문 남겨주셔서 감사합니다.
전반적인 에러 문구를 보았을 떄, Authorization
헤더에 값이 이상한거 같습니다.
다음과 같은 부분을 확인해보시면 좋을 꺼 같아요.
API에 들어오는 헤더 값
요청을 하는 API 소스
JwtProvider에서 token을 핸들링 하는 소스
1번 과정에 대해서는 기본적인 로그를 찍어보시고 확인해보시면 좋을 꺼 같고
2,3번 과정에 대해서는 소스 제공해 주시면 확인해보도록 하겠습니다.
감사합니다!
음 로그상 저렇게 노출이 된다면, 기본적인 값은 정확하게 들어온거 같습니다.
하지만 에러구문 상에서, JWTDecodeException이 발생하고, 에러 문구는 다음과 같이 발생하고 있습니다.
The token was expected to have 3 parts, but got 1.
이 에러는 기본적으로 JWT는 3가지 파트로 구성이 되어 있는데, 디코딩을 진행하니 한가지 파트로만 진행이 되어 있다는 에러 입니다.
즉 Token을 잘못생성하여 값을 전달한게 아닐까 싶습니다.
우선적으로 사용하시는 Token을 다음과 같은 사이트에서 확인하시고 3가지 파트로 구성이 되어 있는지 확인해보시면 좋을 꺼 같습니다.
그리고 만약 문제가 있다면, 토큰을 생성하는 부분이나, Clinet에서 값을 잘라서 보내는지를 확인해봐야 할 꺼 같습니다.
안녕하세요!
npm run dev 하는 쪽의 로그를 보니
⨯ src\components\chat\chat-layout.tsx (36:22) @ document
⨯ ReferenceError: document is not defined
at getCookie (./src/components/chat/chat-layout.tsx:26:24)
at useMountEffect (./src/components/chat/chat-layout.tsx:42:28)
at ChatLayout (./src/components/chat/chat-layout.tsx:78:5)
digest: "1286481958"
34 | function getCookie(name: string): string | undefined {
35 |
> 36 | const value = ; ${document.cookie}
;
| ^
37 | const parts = value.split; ${name}=
);
38 | if (parts.length === 2) return parts.pop()?.split(";").shift();
39 | }
GET / 500 in 107ms
GET /.well-known/appspecific/com.chrome.devtools.json 404 in 64ms
이런 에러가 나옵니다...처음부터 token값이든 cookie 값이든 가져올 때 잘못 가져와서 그런건가요...? 제 생각에는 처음부터 가져올 때 잘못 작성한 게 있는 것 같아서 이 부분부터 해결해야 할 것 같습니다ㅠㅠ
여기저기 검색해보고 선생님께서 올려주신 소스코드도 보고 하는데 대체 어디가 문제인지 알 수가 없습니다..
그리고 한번 로그인 하면 그 뒤로 계속 자동으로 로그인 되는데, 이 부분도 어딜 수정해야 하는지 알려주실 수 있으실까요...?
항상 답변 주셔서 감사합니다ㅠㅠ
스승의 날인데 모쪼록 좋은 하루 보내세요!
한번 로그인을 진행을 하게 되면, 브라우저의 쿠키를 저장하게 됩니다.
개발자 도구에서 Application
이후 Cookie에서 값을 삭제하면 될 꺼 같습니다.
현재 제 화면인데 해당 화면과 유사하게 접속하셔서 삭제하시면 됩니다.
우선 Login
컴포넌트에서
useEffect(() => {
// Client-side cookie access to check if user is already authenticated
const authCookie = document.cookie
.split("; ")
.find((row) => row.startsWith("auth="));
if (authCookie) {
router.push("/");
}
}, [router]);
const handleSubmit = async (event: FormEvent) => {
event.preventDefault();
// Add login logic here
const result = await api.post("/api/v1/auth/login", {
name: username,
password: password,
});
if (!result.data.token) {
alert("존재하지 않은 User 입니다.");
return;
}
document.cookie = `auth=${result.data.token}; path=/`;
router.push("/");
};
해당 소스에 들어오는 result.data.token
에 console.log를 찍어서 값을 확인해 봐야 할 꺼 같습니다.
안녕하세요! console.log에 찍어봤는데,
const handleSubmit = async (event: FormEvent) =>
이 안에서 찍히지 않는 것을 확인했습니다!! 혹시 따로 다운로드하거나 import 시켜야 할 것이 있는 건가요?
안녕하세요! 답이 늦어져서 죄송합니다.
token값을 제가 "token"으로 넣는 바람에 그대로 "token"으로 들어가서 해당 에러가 나온 것 같습니다ㅠㅠ(그래서 해결되었습니다ㅎ)
정말..친절히 답 주셔서 감사합니다!!
0
안녕하세요, 인프런 AI 인턴입니다. cloverj0님.
JWTDecodeException
에러는 보통 JWT 토큰의 형식이 올바르지 않을 때 발생합니다. JWT 토큰은 일반적으로 header.payload.signature
형태로 이루어져 있어야 합니다. 에러 메시지에 따르면, 토큰이 예상하는 3개의 파트를 포함하고 있지 않음을 의미합니다. 이 문제는 다양한 원인으로 발생할 수 있으며, 다음과 같은 부분을 확인해 보세요.
header
, payload
, signature
를 올바르게 설정되었는지 점검해 주세요.UserControllerV1
의 Authorization
헤더에서 JWT 토큰을 올바르게 추출하고 있는지 확인하세요. JWT는 Bearer
접두사 없이 순수한 토큰 문자열이어야 합니다.searchUser
메서드 실행 전후로 디버깅 로그를 추가하여 토큰 값이 어떻게 처리되고 있는지 확인해 보세요. 이렇게 하면 문제가 발생하는 시점을 더 자세히 파악할 수 있습니다.JWT 관련한 문제를 해결하는데 도움이 될 수 있는 다음 자료도 참고해 보세요:
- JWT 토큰 형식과 구조 이해하기
- Spring Security와 JWT 통합 시 발생할 수 있는 일반적인 에러 해결
위의 내용을 참고하여 문제를 해결하시길 바랍니다. 제가 제공한 링크들은 유사한 문제 해결에 도움이 될 수 있으며, 추가적으로 궁금하신 점이 있으면 언제든지 질문해 주세요. 곧 지식공유자께서도 도움을 주실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요!
1번에 알려주신 헤더 값을 찍어보니
=========authString=============Bearer token (헤더부분)
=========token=============token
이렇게 값이 나옵니다! 이 두 값이 나오는 게 맞을까요?
소스는
https://github.com/hyunjin-joo/inf_study.git
이곳에 src 폴더를 업로드 해놓았습니다!! 더 확인해 봐야 할 폴더가 있으시면 말씀 부탁드립니다:)
(또는 https://drive.google.com/drive/folders/1Yi7cJpnW360yN9kCoWfTWGe7jYVCEHpb?usp=sharing
여기에서 확인 부탁드립니다! - 몇 개의 파일은 다 업로드가 되지 않아 더 확인해야 할 파일이 있으면 말씀 부탁드립니다!)
항상 친절히 답 주셔서 감사합니다!