Json Web Token의 약자로 통신 시 인증을 위해 주로 사용하는 토큰.


다음과 같이 세 부분으로 구성된다. 아래 그림의 정보들이 위 그림처럼 . 을 기준으로 나뉘어 구성되며 url 인코딩에 안전한 base64 인코딩을 사용한다.
토큰의 타입 + 서명에 사용할 알고리즘 정보로 구성되어 있다.
필요한 정보들을 담는 부분이다. 그러나 jwt는 복호화가 쉽기 때문에 민감한 정보들은 담지 않는 것이 좋다.
위 그림처럼 하나의 key-value 쌍을 한 claim이라고 하며 구성은 커스텀 가능하다.
보통 사용되는 claim은 다음과 같다.
jwt의 가장 핵심 부분이다.
헤더와 payload를 . 을 구분자로 합쳐서 헤더에 명시된 암호화 알고리즘으로 private key를 이용하여 암호화 한다.
클라이언트가 처음 로그인 시 서버에서 로그인 정보를 확인하면 JWT 토큰을 발행해 준다.
이후 클라이언트는 요청을 보낼 때 헤더에 jwt 토큰을 함께 보냄으로써 서버로부터 인증 받는다.

이러한 jwt token은 중간에 탈취당하기 쉽기 때문에 보통 주고 받는 토큰은 만료 시간을 짧게 한다. 이를 Access Token이라고 한다.
또한 서버는 처음 로그인한 유저에게 토큰을 발행해줄 때 Access Token 말고 만료 시간이 더 긴 Refresh Token도 같이 발행해서 이를 서버에 저장한다.
이후 Access Token이 만료되면 서버에 있는 Refresh Token을 이용해 새로운 Access Token을 발행한다.

기존에는 세션에 사용자의 정보를 기억하고 있다가, 요청이 들어오면 세션을 찾아서 클라이언트를 인증하는 방식이다. 그러나 jwt 방식은 클라이언트가 인증 수단(토큰)을 관리한다.
이제 JWT에 대해 어느정도 알았으니, 본격적으로 구현해보자!
먼저 build.gradle에 사용할 라이브러리들의 의존성을 추가해야 한다.
//build.gradle dependency에 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
//JWT
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
토큰을 생성해서 값을 가지고 있을 Dto 클래스를 하나 만든다.
public record JwtDto(
String accessToken,
String refreshToken) {
}
초 간단하게 만들었따.
유저 정보를 저장할 Entity도 필요하다.
@Entity
@Builder
@NoArgsConstructor(access = PROTECTED)
@AllArgsConstructor(access = PRIVATE)
public class User {
@Id @GeneratedValue
@Column(name = "user_id")
private Long id;
@Column(length = 25)
private String email;
@Column(length = 20, nullable = false)
private String password;
@Column(length = 20, nullable = false)
private String nickname;
}
SpringSecurity와 실제 JWT 적용은 다음 포스트에서 이어서 해보자... 공부하다보니 한 번에 너무 많은 정보가 들어오니 정리가 안된다.