JWT를 선택하는 이유

JWT를 선택하는 것에는 다양한 이유가 존재합니다.

  1. Stateless
    • 서버 측에서 세션을 유지하지 않기 떄문에 상태 정보를 저장하고 확인하지 않아 서버 부하의 원인이 되지 않고, 여러 대의 서버나 분산 시스템으로 구성된 환경에서도 동일한 토큰을 사용하여 인증 처리가 가능합니다.
  2. Scalable
    • 디바이스별 요청마다 발급되는 토큰의 값만 확인하고 체크하는 행위로 안전하게 접근 제어 및 권한 부여등 작업을 처리할 수 있어 확장에 용이합니다.
  3. Extensibility
    • 로그인 정보가 사용되는 분야의 확장이 가능합니다. 이는 토큰을 사용하여 다른 서비스에서 권한을 공유할 수있는 것을 말합니다.(소셜 로그인)
  4. Security
    • HTTPS와 함께 사용하면 더 안전하게 사용할 수 있습니다.

하지만 이 토이 프로젝트를 진행한 이유는 한번도 사용해본적 없고 많은 기업에서 사용하기에 구현해보기 위해 JWT를 이용해보기로 하였습니다.

 

JWT 인증방식은 이전글에서 설명하여 생략

 

1. 스프링부트 프로젝트 생성

JAVA 버전 11로 환경을 구성하여 세팅하였습니다.

 

2. 의존성 설정

스프링 스타터 패키지, JPA, security, redis, jwt, lombok, mariadb, configuration-processor에 관한 의존성을 추가해줍니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
    implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
    runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5'

    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'

    annotationProcessor 'org.projectlombok:lombok'
    annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.security:spring-security-test'
}

 

3. application.yml 세팅

DB는 Mariadb를 사용하기 때문에 MariaDb에 관한 세팅을 해주었습니다.
redis는 로그아웃할 떄 이용하기 때문에 설정을 추가해줍니다.
jwt의 secret관련 부분은 HS512알고리즘을 사용하기 때문에 64바이트 이상의 길이를 가진 secret으로 설정해줍니다.

spring:
    datasource:
        url: jdbc:mariadb://localhost:3306/{DbName}?characterEncoding=UTF-8&serverTimezone=UTC
        username: root
        password: 1234
        driver-class-name: org.mariadb.jdbc.Driver
    jpa:
        hibernate:
            ddl-auto: create
        properties:
            hibernate:
                format_sql: true
                default_batch_fetch_size: 100
    redis:
        pool:
            min-idle: 0
            max-idle: 8
            max-active: 8
        port: 6379
        host: localhost
logging:
    level:
        org.hibernate.SQL: debug
        org.hibernate.type: trace

jwt:
    header: Authorization
    secret: eyJSb2xlIjoiQWRtaW4iLCJJc3N1ZXIiOiJQc3NyIERldiIsIlVzZXJuYW1lIjoiUHJlc2lkZW50aWFsIFByb3RlY3Rpb24gQW5kIFNlY3VyaXR5IiwiaWF0IjoxNjg3MDA0Mjg1fQ
    refresh_secret: RUUyNkIwREQ0QUY3RTc0OUFBMUE4RUUzQzEwQUU5OTIzRjYxODk4MDc3MkU0NzNGODgxOUE1RDQ5NDBFMERCMjdBQzE4NUY4QTBFMUQ1Rjg0Rjg4QkM4ODdGRDY3QjE0MzczMkMzMDRDQzVGQTlBRDhFNkY1N0Y1MDAyOEE4RkY=
    access_token_expired: 360000
    refresh_token_expired: 1209600000

+ Recent posts