인프런의 Spring Boot JWT Tutorial의 강의를 보고 정리해 보았습니다.
해당 강의는 간단하게 H2 데이터 베이스를 사용하여 JWT 인증 구현을 진행한다. 유저와 인증정보를 가진 Entity를 통해 JWT를 적용하는 방법을 알려준다.
Build Gradle 설정
JWT를 적용하기 위해서 다음과 같은 디펜던시를 추가해주었다.
- Spring Web
- Spring Security
- Spring Data JPA
- H2 Database
- Lombok
- Validation
plugins {
id 'org.springframework.boot' version '2.7.3'
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
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-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
//JWT 관련 설정
implementation 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'
}
tasks.named('test') {
useJUnitPlatform()
}
SecurityConfig 설정
스프링 시큐리티를 추가하였다면 api를 호출할 때 로그인 정보가 없으므로 "401 Unauthorized" 에러가 발생한다. 로그인 이전에 api를 테스트하기 위해서는 "SecurityConfig.class"를 생성해 로그인 정보 필요 없이 접근할 수 있도록 세팅을 해줘야 한다.
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity // 스프링 시큐리티 필터가 스프링 필터체인에 등록이 됨
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web
.ignoring()
.antMatchers(
"/h2-console/**", //h2-console 하위 요청에 관해서는 Spring Security 로직을 수행하지 않도록 설정
"/favicon.ico" //위와 같음
);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() //HttpServletRequest를 사용하는 요청들에 대해 다음과 같은 접근제한 설정을 하겠다는 의미
.antMatchers("/api/hello").permitAll() // 해당 api에 대한 요청은 인증없이 접근가능하도록 허용
.anyRequest.authenticated(); // 나머지 요청들에 대해서는 인증 필요
}
}
하지만 위의 SecurityConfig 세팅에서 "WebSecurityConfigurerAdapter"는 스프링 부트 2.7.3의 버전에서 deprecated 되었으므로 추후에 2.7.3 버전에 맞게 다시 세팅하도록 하겠다.
application.yml 설정하기
spring:
h2:
console:
enabled: true
datasource:
url: jdbc:h2:mem:testdb
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
database-platform: org.hibernate.dialect.H2Dialect
hibernate:
ddl-auto: create-drop
properties:
hibernate:
format_sql: true
show_sql: true
defer-datasource-initialization: true
jwt:
header: Authorization
secret: c2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQtc2lsdmVybmluZS10ZWNoLXNwcmluZy1ib290LWp3dC10dXRvcmlhbC1zZWNyZXQK
token-validity-in-seconds: 86400
spring-jpa-defer-datasource-initialization: true
→ 스프링 부트 2.5부터는 hibernate의 초기화 과정보다 data.sql이 먼저 실행되기 때문에 오류가 발생한다. 따라서 다음과 같은 설정 필요
jwt-token-validity-in-seconds: 86400
→ 토큰 만료 시간
다음 포스팅
[Spring Boot JWT Tutorial - 인프런] 스프링 JWT 적용하기 part2. JWT 관련 설정하기
'Spring' 카테고리의 다른 글
[Spring Boot JWT Tutorial - 인프런] 스프링 JWT 적용하기 part3. Repository, 로그인 API 구현 (0) | 2022.09.03 |
---|---|
[Spring Boot JWT Tutorial - 인프런] 스프링 JWT 적용하기 part2. JWT 관련 설정하기 (0) | 2022.09.03 |
7. JDBC, SQL Mapper, ORM (2) | 2022.07.15 |
6. 스프링 Servlet (0) | 2022.07.02 |
5. 스프링 AOP (0) | 2022.06.28 |