2024-05-31 오늘의 TIL - Jwt (1)

이재성·2024년 6월 3일
post-thumbnail

스프링 JWT 시큐리티 구현

MySQL 데이터베이스를 활용 JWT 기반의 인증/인가를 구현하고 회원 정보 저장하기

  • 인증 = 로그인
  • 인가 = JWT를 통한 경로별 접근 권한

회원가입 : 내부 회원 가입 로직은 세션 방식과 JWT 방식의 차이가 없다.

로그인 (인증) : 로그인 요청을 받은 후 세션 방식은 서버 세션이 유저 정보를 저장하지만 JWT 방식은 토큰을 생성하여 응답한다.

필수 Dependencies

  • Lombok
  • Spring Web
  • Spring Security
  • Spring Data JPA
  • MySQL Driver
 // JWT
    compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
    runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'

Spring Security 란?

Spring의 보안(인증과 권한, 인가 등)을 담당하는 서블릿 필터의 집합이다.
서블릿 필터는 서블릿 실행 전에 실행되는 클래스들로 토큰 인증을 위해 컨트롤러 메서드의 첫 부분마다 인증 코드를 작성하는 고민을 해결하기 위해 서블릿 필터를 사용

JWT 란?

전자 서명 토큰 중 하나, 서버가 헤더와 페이로드를 생성한 후 전자 서명을 한다는 특징이 있다.
JSON 형태의 토큰으로 {header}.{payload}.{signature}로 구성되어있고, 토큰 기반 인증이므로 서버가 생성함.

  • 장점
    사용자 인증에 필요한 모든 정보는 토큰 자체에 포함하기 때문에 별도의 인증 저장소가 필요 없다.
    URL 파라미터와 헤더로 사용
    수평 스케일이 용이하다
    디버깅 및 관리가 편하다.
    REST 서비스로 제공이 가능하다

  • 단점
    토큰은 클라이언트에 저장되어 데이터베이스에서 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없다.
    더 많은 필드가 추가되면 토큰이 커지게 된다.

  • 구성
  1. Header
    typ : Type을 줄인 말로 토큰의 타입
    alg : Alogrithm을 줄인 말로 토큰의 서명을 발행하는 데 사용된 해시 알고리즘 종류를 의미함

2.Payload
sub : Subject를 줄인 말, 토큰의 주인을 의미 sub는 ID처럼 유일한 식별자여야함.
iss : Issuer를 줄인 말, 토큰을 발행한 주체를 의미한다.
iat : issued at을 줄인 말, 토큰이 발행된 날짜와 시간
exp : expiration을 줄인 말, 토큰이 만료되는 시간

3.Signature
토큰의 유효성 검사에 사용함.

JWT 토큰 발행

토큰 발행 > 로그인 시 토큰 반환 > 토큰을 이용해 API 인증

  1. JWT 라이브러리 추가(gradle)

  2. 토큰 클래스 생성(TokenProvider.java)

  3. 토큰을 생성한 후 반환할 DTO 생성(UserDTO.java)

  4. 사용자 Controller 생성

Spring Security + JWT

  1. 토큰 인증 필터 생성( JwtFilter.java)

1) 요청의 헤더에서 Bearer 토큰을 가져온다.
2) 클래스를 이용해 토큰을 인증한다.
3) 오브젝트에 사용자의 인증 정보를 저장하고 Security에 인증된 사용자를 등록한다. 등록하여 요청을 처리하는 과정에서 사용자가 인증됐는지 여부나 인증된 사용자가 누군지 알 수 있다.

  1. Spring Security 설정

  2. Controller 인증 적용

profile
하이요

0개의 댓글