Spring Boot 로그인, 회원가입 기능 구현 feat: JWT, Spring Security [1]

김용현·2024년 1월 7일

사이드 프로젝트

목록 보기
2/6

개발 To do ✏️

  • Spring Security와 JWT 토큰을 이용하여 자체(소셜 X)로그인 기능을 구현한다.

JWT란?

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

JWT 구성

다음과 같이 세 부분으로 구성된다. 아래 그림의 정보들이 위 그림처럼 . 을 기준으로 나뉘어 구성되며 url 인코딩에 안전한 base64 인코딩을 사용한다.

토큰의 타입 + 서명에 사용할 알고리즘 정보로 구성되어 있다.

payload

필요한 정보들을 담는 부분이다. 그러나 jwt는 복호화가 쉽기 때문에 민감한 정보들은 담지 않는 것이 좋다.
위 그림처럼 하나의 key-value 쌍을 한 claim이라고 하며 구성은 커스텀 가능하다.
보통 사용되는 claim은 다음과 같다.

  • Issuer (jwt 발행자)
  • Subject (jwt 제목)
  • Audience (jwt가 의도된 수신자)
  • Expiration time (만료 시간)
  • Issued at (발행 시간)

signature

jwt의 가장 핵심 부분이다.
헤더와 payload를 . 을 구분자로 합쳐서 헤더에 명시된 암호화 알고리즘으로 private key를 이용하여 암호화 한다.

동작 원리

클라이언트가 처음 로그인 시 서버에서 로그인 정보를 확인하면 JWT 토큰을 발행해 준다.
이후 클라이언트는 요청을 보낼 때 헤더에 jwt 토큰을 함께 보냄으로써 서버로부터 인증 받는다.

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

기존 방식과의 차이점

기존에는 세션에 사용자의 정보를 기억하고 있다가, 요청이 들어오면 세션을 찾아서 클라이언트를 인증하는 방식이다. 그러나 jwt 방식은 클라이언트가 인증 수단(토큰)을 관리한다.

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'

JwtTokenDto 정의

토큰을 생성해서 값을 가지고 있을 Dto 클래스를 하나 만든다.


public record JwtDto(
		String accessToken, 
		String refreshToken) {
        
}

초 간단하게 만들었따.

User Entity 정의

유저 정보를 저장할 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 적용은 다음 포스트에서 이어서 해보자... 공부하다보니 한 번에 너무 많은 정보가 들어오니 정리가 안된다.

참고자료

SpringSecurity + JWT 로그인 구현하기
JWT란 무엇인가

profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글