Kotlin/Spring

(Spring) 인증 개발을 하면서 겪은 다양한 버그들

너어디사니 2024. 6. 5. 20:07

1. Error creating bean with name 'jwtPlugin' defined in file

  • 여러가지 원인이 있을 수가 있었다
    1. Jwt의 의존성이 제대로 적용이 안되어 있을 수 있다
    2. application.yml 파일에 설정을 제대로 적용을 안했을 수도 있다
    3. JwtPlugin에 @Component Annotation을 붙여주지 않았다
  • 나는 이번에 확인 시 에 2번 application.yml 파일에 설정을 제대로 되지 않은 문제가 있었다 정확하게 말하면 주입 받는 생성자에 제대로 된 경로를 적어주지 않아서 발생한 문제였다 따라서 해당 경로를 수정해주면서 문제를 해결 했다

AS-IS

@Component
class JwtPlugin(
    @Value("\${jwt.issuer}") private val issuer: String, //경로 누락
    @Value("\${jwt.secret}") private val secret: String, //경로 누락
    //경로 누락 및 } 누락
    @Value("\${jwt.accessTokenExpirationHour") private val accessTokenExpirationHour: Long,
   
) {

    fun validToken(jwt: String): Result<Jws<Claims>>{
        return kotlin.runCatching {
            val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))
            Jwts.parser().verifyWith(key).build().parseSignedClaims(jwt)
        }

    }

 

TO-BE

@Component
class JwtPlugin(
    @Value("\${auth.jwt.issuer}") private val issuer: String,
    @Value("\${auth.jwt.secret}") private val secret: String,
    @Value("\${auth.jwt.accessTokenExpirationHour}") private val accessTokenExpirationHour: Long,
) {

    fun validToken(jwt: String): Result<Jws<Claims>>{
        return kotlin.runCatching {
            val key = Keys.hmacShaKeyFor(secret.toByteArray(StandardCharsets.UTF_8))
            Jwts.parser().verifyWith(key).build().parseSignedClaims(jwt)
        }

    }

2. NotAuthenticationException 발생 시에 애러 메세지가 안나오는 현상

  • 단순하게 ErrorResponse를 body로 리턴하지 않고 build를 해버려서 원하는 에러 메세지가 나오지 않는 현상이었다

AS-IS

 

  @ExceptionHandler(NotAuthenticationException::class)
    fun notAuthenticationException(e: Exception): ResponseEntity<ErrorResponseDto>{
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build() // 오류 메세지 전송 안함
    }

 

TO-BE

 

@ExceptionHandler(NotAuthenticationException::class)
    fun notAuthenticationException(e: Exception): ResponseEntity<ErrorResponseDto>{
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ErrorResponseDto("인증 오류 : ${e.message}"))
    }