class java.lang.String cannot be cast to class 오류

2024. 6. 27. 21:31TIL

✔오늘 배운 중요한 🔑 point

🎯 오늘 배운 내용

 

 

문제발생

프로젝트를 진행하면서 기존 CRUD에 추가적인 작업을 하고 swagger로 테스트를 하던 도중 에러가 발생하였다.

 

 

로그인 한 사용자가 다른 post를 수정하려고 할때 예외처리가 발생하는데, 예외처리가 발생하고 나서 본인의 게시글을 수정하려고 하는 작업을 3번 4번 이상 수행 할때 해당 오류가 발생하였다.

 

java.lang.ClassCastException: class java.lang.String cannot be cast to class cohttp://m.example.brushuptodolist.domain.authentication.jwt.UserPrincipal (java.lang.String is in module java.base of loader 'bootstrap'; cohttp://m.example.brushuptodolist.domain.authentication.jwt.UserPrincipal is in unnamed module of loader 'app')

userPrincipal에 제대로 된 값이 아닌 String값이 들어간 상황

 

처음에는 정상적으로 수행이 잘 되다가 3번 4번째 시도할때부터 403 에러가 발생하는 상황이다

안될거면 처음부터 안되야 하는데 왜 처음에 되고 3번째 4번째부터 안될까...

 

화가 난다

 

 

디버깅을 통해서 문제를 해결해보자

 

 

🆘 해결 과정

 

현재 userPrincipal쪽에서 문제가 발생한 것이 유력해보이니 userPrincipal에 값이 잘 들어왔나 확인해보자

 

userPrincipal에는 값이 잘 들어와있다

 

실제로 잘 작동이 되는것을 확인할 수 있지만...

 

 

 

여러번 시도를 하면 다시 userPrincipal에 anonymousUser가 들어와있는것을 확인할 수 있다.

 

방금전까지 사용자 정보를 잘 불러오더가 갑자기 정보를 불러오지 못하는 문제이기 때문에 토큰에 문제가 있는지 jwt.io에서 확인을 해보았다.

당연히 토큰에는 정보가 잘 저장되어있었지만 만료시간이 1분뒤로 되어있는 상황

 

fun generateToken(userEmail: String, userName: String, userRole: UserRole): String {

    val claims = Jwts.claims().add(mapOf("userEmail" to userEmail, "userName" to userName, "userRole" to userRole)).build()

    val key =  Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))

    return Jwts.builder()
        .claims(claims)
        .subject(userEmail)
        .issuer(issuer)
        .expiration(Date(System.currentTimeMillis() + 3600 * 24))
        .signWith(key).compact()

}

분명히 토큰의 유효기간은 하루 뒤로 설정하였는데 왜 1분뒤로 되어있을까?

 

Date(System.currentTimeMillis() + 3600 * 24)가 86400초(1일)가 아닌 86400 밀리초(1분 26초) 로 설정이 되어있었기 때문에  오류가 발생한 것이었다....

토큰의 만료시간을 다시 작성하였다.

 

해결

 

val expirationTimeInMillis = 24 * 60 * 60 * 1000
return Jwts.builder()
    .claims(claims)
    .subject(userEmail)
    .issuer(issuer)
    .expiration(Date(System.currentTimeMillis() + expirationTimeInMillis))
    .signWith(key).compact()

 

토큰의 유효시간이 하루 뒤로 제대로 적용이 된것을 확인할 수 있다.

 

 

이제 정상적으로 시간이 흐르더라도 작동이 잘 되는것을 볼 수 있다.

 

 

🤔 어떻게 활용할까?

인증부분에 문제가 생겼을때는 https://jwt.io/ 에서 토큰이 올바르게 잘 설정이 되어있는지를 꼭 확인하자

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

📓 오늘의 한줄

"It's not how far you fall, but how high you bounce that counts."

- Zig Ziglar -

 

 

'TIL' 카테고리의 다른 글

Connection refused: getsockopt 오류  (0) 2024.06.29
spring Boot에서 Redis 연결하기  (0) 2024.06.28
.let  (0) 2024.06.26
CDN(Content Delivery Network)  (0) 2024.06.25
CAP 정리  (0) 2024.06.24