• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JWT 관련 질문입니다.

23.05.06 11:51 작성 조회수 255

0

https://www.inflearn.com/questions/810394/%EC%9D%B8%EC%A6%9D%EC%9A%94%EC%B2%AD%EC%8B%9C-%EB%AC%B8%EC%9D%98%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4
호돌맨님 강의 정말 잘 듣고 있습니다. 다름이 아니라 저도 이 질문과 같은 의문이 생겼는데 해답을 찾지 못해 질문드립니다. 추가적으로 accessToken이

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjgzMzQwODAzfQ.4c7pfgz689iJdKBrInNP4QBf7YLc-bW_FVkb0JNHvk

라고 했을 때 맨뒤 k를 다른 알파벳으로 바꿔도 정상적으로 요청이 되는 경우가 있던데 이 이유도 잘 모르겠습니다.. 알려주시면 감사하겠습니다 !!

답변 1

답변을 작성해보세요.

0

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

JWT 토큰 검증

동일한 key로 생성한 암호화 데이터는 언제든지 복호화 될 수 있습니다. 해당 정보는 동일한 key로 암호화 한 이상 우주에서는 영원불멸합니다.
질문자분께서 로그인을 여러번 하여 토큰을 몇 개 발급 했는지는 중요하지 않습니다.

로그인 과정에서 토큰을 발급받는 것은 이 열쇠를 획득하는 과정과 비슷합니다. 열쇠는 보안을 강화하기 위해 매번 새로운 형태로 제작됩니다. 토큰 역시 각각의 로그인 시도마다 새로운 값으로 발급됩니다.

이전에 획득한 열쇠로 문을 여는 것이 가능한 이유는 문 앞에서 열쇠를 검증하는 과정에서 문에 부착된 장치가 열쇠를 인식하고, 열쇠의 유효성을 확인하기 때문입니다. 이 장치는 열쇠에 부여된 고유한 특성을 가지고 있어서 이전에 발급된 열쇠라도 검증이 가능합니다.

그러므로 한 번 발급된 토큰은 재 사용될 수 있기때문에 클라이언트 측에서 유출되지 않도록 관리하는게 중요합니다.
예를들어 서버에서는 발급 된지 오래된 토큰은 인증처리 되지 않도록 할 수 있습니다.

복호화

암호화 할때 사용하신 key를 말씀해주시면 테스트 해보도록 하겠습니다.

감사합니다.

민혁님의 프로필

민혁

질문자

2023.05.08

답변해주셔서 감사합니다 !


추가적으로 accessToken이

eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjgzMzQwODAzfQ.4c7pfgz689iJdKBrInNP4QBf7YLc-bW_FVkb0JNHvk

라고 했을 때 맨뒤 k를 다른 알파벳으로 바꿔도 정상적으로 요청이 되는 경우가 있던데 이 이유도 잘 모르겠습니다.. 알려주시면 감사하겠습니다 !!

이 부분은 호돌맨님이 올려주신 코드에서 테스트를 진행했었습니다 !

안녕하세요. 민혁님
민혁님이 주신 accessToken으로 제가 복호화를 시도하면 (끝에 k 여부와 상관없이) 예외가 발생합니다.

JWT 키가 달라서 그런것 같습니다.
강의에서 진행한 키는 rTPmA9Sgk+Q1XwuJbG7E6xFFUhQpdi+al5iyPnRTK/Q= 입니다.
혹시 민혁님이 실습에서 사용하신 key를 알려주시면 다시 시도해보겠습니다.

아래와같이 테스트를 진행했습니다.

@Test
@DisplayName("JWT 복호화 테스트")
void test_20230508_142641() {
    // given
    String accessToken = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxIiwiaWF0IjoxNjgzMzQwODAzfQ.4c7pfgz689iJdKBrInNP4QBf7YLc-bW_FVkb0JNHvk";
    String key = "rTPmA9Sgk+Q1XwuJbG7E6xFFUhQpdi+al5iyPnRTK/Q=";

    // when
    Jws<Claims> claims = Jwts.parserBuilder()
            .setSigningKey(Base64.decodeBase64(key))
            .build()
            .parseClaimsJws(accessToken);

    // then
    assertNotNull(claims.getSignature());
}

감사합니다.

민혁님의 프로필

민혁

질문자

2023.05.08

제가 설명을 잘못드린 것 같아 호돌맨님이 올려주신 코드 기준으로 다시 말씀드리겠습니다 !

먼저 회원 가입 후 auth.http로 accessToken 발급 받았습니다. 발급 받은 토큰은 사진과 같습니다.

image그런데 아래 사진과 같이 post.http로 발급 받은 accessToken의 맨 마지막 알파벳인 Y를 Z로 바꿨을 때 에러가 발생하지 않고 정상적으로 값이 반환되는 것을 확인할 수 있었습니다.

다만, 모든 알파벳이 되는 것이 아니고 되는 경우도 있고 안 되는 경우도 있는데 이유가 궁금해서 여쭤봤습니다.

image

안녕하세요.
호돌맨입니다.

다시 테스트를 진행 해봤는데요, 인증이 정상적으로 성공/실패 됩니다.

accessToken을 암,복호화 하는 테스트 코드를 작성해보시면 어떨까요?

혹은 github 링크를 제공해주시면 자세히 보도록 하겠습니다.ㅠ

감사합니다.