또또 JWT 실행구조 이해해보기

도리·2024년 10월 7일

JAVA

목록 보기
5/7

JWT의 실행구조를 이해해야, 이를 활용한 인증 시스템을 설계하고 리팩토링 할 수 있는 능력이 생길 것이다.
따라서
1. JWT의 개념
2. 작동 방식
3. 실제로 사용하는 흐름
에 대해서 정리해보쟈!!!

1. JWT의 구성 요소

JWT는 세 가지 부분으로 구성된 JSON 객체이다.
각각의 부분은 . 으로 구분되고, 기본적인 구조는 다음과 같다.

  • Header(헤더) : 토큰의 타입과 해싱 알고리즘 정보를 담고 있다.
  • Payload(페이로드) : 실제 인증 정보나 추가적인 데이터를 담는다. 크레임(Claims)이라고도 불리고, 사용자의 정보를 저장한다(예: userId, emial,nickname, role 등등)
  • Signature(서명) : JWT가 위변조되지 않았는지 확인하기 위한 서명이다. 비밀 키와 해싱 알고리즘을 통해 서명을 생성한다.

2. JWT의 작동 방식

JWT는 인증과정에서 주로 다음과 같은 흐름으로 사용된다.

1. 인증 요청 및 JWT 생성

  1. 사용자가 로그인 정보를 전송한다(예: email과 password)
  2. 서버는 이를 확인한 후, 해당 사용자의 정보르 JWT에 담아서 토큰을 생성한다.
  • 이 과정에서 사용자의 id, email, nickname, role과 같은 정보를 페이로드(claims)에 담고, 서버의 비밀 키를 사용해 서명한다.
  • JWT 생성 후, 클라이언트에 이 토큰을 반환한다.

2. 클라이언트에서 JWT 저장 및 사용

  • 클라이언트(예: 브라우저, 모바일 앱)는 이 JWT를 로컬 스토리지나 쿠키에 저장한다.
  • 사용자는 이후 API 요청마다 JWT를 Authorization 헤더에 포함해서 전송한다.
  • 예 : Authorization : Bearer (Bearer는 토큰 앞에 붙이는 접두어로 관례임)

3. 서버에서 JWT 검증 및 사용자 인증

  1. 서버는 요청이 들어올 때마다 JWT가 포함된 헤더를 확인하고, 해당 JWT의 서명을 검증한다.
  2. 서명이 유효하면, JWT의 페이로드(클레임)에서 사용자의 정보를 추출해 인증한다. 이과정에서 userId, email, role등의 정보가 사용된다.
  3. JWT만료시간을 확인해서 유효기간이 남아있는지도 확인한다.
  4. 유효한 경우, 해당 사용자가 인증된 상요자임을 인식하고 요청으 ㄹ처리한다.

3. JWT의 실행 구조 예시 코드

1. JWT생성

public String createToken(Long userId, String email, String nickname, UserRole userRole) {
    Date now = new Date();

    return Jwts.builder()
            .setSubject(String.valueOf(userId))  // 사용자 ID를 subject로 설정
            .claim("email", email)               // 추가적인 클레임 (email)
            .claim("nickname", nickname)         // 추가적인 클레임 (nickname)
            .claim("userRole", userRole)         // 추가적인 클레임 (userRole)
            .setIssuedAt(now)                    // 토큰 발행 시간
            .setExpiration(new Date(now.getTime() + TOKEN_TIME)) // 만료 시간
            .signWith(key, SignatureAlgorithm.HS256)  // 비밀 키로 서명
            .compact();                           // 토큰을 직렬화하여 문자열로 반환
}
  • setSubject : JWT의 subject는 일반적으로 사용자 ID와 같은 중요한 정보를 나타낸다.
  • claim : 추가적인 사용자 정보를 JWT에 포함시킬 떄 사용한다.
  • setIssuedAt, set/expiration : JWT의 발행 시간과 만료시간을 설정한다.

2. JWT에서 클레임 추출 및 검증

public Claims extractClaims(String token) {
    return Jwts.parserBuilder()
            .setSigningKey(key)  // JWT 생성 시 사용한 비밀 키
            .build()
            .parseClaimsJws(token)  // 토큰 파싱 및 검증
            .getBody();             // 검증된 클레임 추출
}
  • parseClaimsJws : JWT의 서명을 검증하고, 서명이 유효하면 클레임을 반환한다.
  • getBody : 검증된 JWT의 페이로드에서 클레임을 추출한다.
profile
헬로

0개의 댓글