2024. 6. 27. 21:31ㆍTIL
✔오늘 배운 중요한 🔑 point
- Security Context에서 가져온 객체가 String 타입일때 해당 오류가 발생한다
- anonymousUser는 인증되지 않은 사용자로 Spring Security에서 기본적으로 사용하는 문자열
- https://jwt.io/ 사이트를 활용하여 나의 토큰이 제대로 설정되어있는지 처음에 꼭 확인하자
🎯 오늘 배운 내용
❎ 문제발생
프로젝트를 진행하면서 기존 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/ 에서 토큰이 올바르게 잘 설정이 되어있는지를 꼭 확인하자
📓 오늘의 한줄
"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 |