본문 바로가기
내일배움캠프/회고록

9월 11일

by jhdevtrace 2024. 9. 12.

결론

과제 2-8, 2-9 완료

코드카타 : 푸드 파이트 대회

RequestContextHolder의 개념

에러 Illegal base64 character 2d

에러 io.jsonwebtoken.security.WeakKeyException

 

 

 

RequestContextHolder

AOP는 메서드 호출 시점에서 동작하는 것이기 때문에, 일반적인 서블릿 필터처럼 직접적으로 `HttpServletRequest`를 주입받지 않는다. 따라서 현재 요청에 대한 정보를 얻으려면, 스프링이 제공하는 `RequestContextHolder`를 통해 접근해야 한다.
이 방법을 사용하면 AOP에서도 현재의 HTTP 요청에 접근할 수 있기 때문에, 서블릿의 어트리뷰트를 가져오거나 다른 요청 관련 정보를 얻고자 할 때 유용합니다.

 

 

Illegal base64 character 2d  에러 원인 : 시크릿 키를 Base64 문자열로 사용하지 않은 경우

  • Illegal base64 character 2d: 이 메시지는 키에 포함된 2d(즉, `` 문자)가 Base64 인코딩에 적합하지 않음을 나타냅니다. Base64 인코딩된 문자열에는 알파벳 대문자와 소문자, 숫자, +, / 문자만 포함될 수 있으며, 패딩을 위한 = 문자도 허용됩니다.

해결 방법

  1. 유효한 Base64 문자열 사용:
    • jwt.secret.key로 사용된 문자열이 올바르게 Base64 인코딩된 문자열인지 확인하세요. 만약 이 문자열이 직접 생성된 값이라면, 이를 Base64로 올바르게 인코딩해야 합니다.
    예를 들어:그리고 이 encodedKey를 jwt.secret.key로 사용하세요.
  2. java 코드 복사 String secretKey = "your-plain-text-key"; String encodedKey = Base64.getEncoder().encodeToString(secretKey.getBytes());
  3. 키를 Base64 인코딩하지 않은 상태로 사용:
    • 만약 키를 인코딩하지 않고 원래의 문자열 그대로 사용하고 싶다면, Base64로 디코딩하지 않도록 JwtUtil 클래스에서 처리 방법을 수정할 수 있습니다.
    예를 들어:
  4. java 코드 복사 @PostConstruct public void init() { // 기존의 Base64 디코딩을 제거하거나, 필요에 따라 유효한 Base64 문자열로 변경 this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); }
  5. 문자열 교체:
    • 키에 사용된 문자열에서 ``(하이픈)과 같은 유효하지 않은 Base64 문자를 제거하거나 대체할 수 있습니다. 그러나 이는 보안을 고려하여 적절한 방법으로 수행해야 합니다.

 

 

 

 

에러 io.jsonwebtoken.security.WeakKeyException 원인 : JWT 키가 너무 짧음

  • io.jsonwebtoken.security.WeakKeyException은 JWT 토큰을 생성하는 데 사용되는 키의 크기가 너무 작아서 발생합니다. HMAC-SHA256 알고리즘을 사용하려면 키 크기가 최소 256비트(32바이트) 이상이어야 합니다.

해결 방법

  1. 더 긴 비밀 키 사용:
    • jwt.secret.key로 설정된 비밀 키를 더 길고 복잡한 값으로 변경해야 합니다. 최소 256비트(32바이트) 이상의 키를 사용하세요.
    예를 들어, 아래와 같이 Keys.secretKeyFor(SignatureAlgorithm.HS256)을 사용하여 안전한 키를 생성할 수 있습니다:또는 application.properties에서 더 긴 키를 설정할 수 있습니다:
  2. properties 코드 복사 jwt.secret.key=your-longer-and-more-secure-key-which-is-at-least-32-characters
  3. java 코드 복사 import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; public class JwtUtil { private String secretKey; @PostConstruct public void init() { byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8); if (keyBytes.length < 32) { // 32 bytes == 256 bits throw new IllegalArgumentException("Key is too short. It must be at least 256 bits."); } this.key = Keys.hmacShaKeyFor(keyBytes); } }
  4. 자동으로 키 생성:
    • 보다 안전한 방식으로 키를 자동으로 생성하고 관리하려면 다음과 같은 방법을 사용할 수 있습니다:
    java
    코드 복사
    import io.jsonwebtoken.SignatureAlgorithm;
    import io.jsonwebtoken.security.Keys;
    
    public class JwtUtil {
        private Key key;
    
        @PostConstruct
        public void init() {
            this.key = Keys.secretKeyFor(SignatureAlgorithm.HS256);  // 이 방법은 안전한 256비트 키를 자동으로 생성합니다.
        }
    }
    
    

 

'내일배움캠프 > 회고록' 카테고리의 다른 글

10월 11일 주특기 플러스 과제 회고  (1) 2024.10.11
8월 23일 금요일  (0) 2024.08.26
8월 22일 목요일  (0) 2024.08.23
8월 19일 월요일  (0) 2024.08.20
8월 13일 화요일  (0) 2024.08.14