[Spring Security] JWT 인증을 활용한 API 보안 설정

kingkang·2024년 12월 12일

🌸 Spring

목록 보기
1/2
post-thumbnail

✅ 프로젝트 환경

  • Spring Boot 3.x
  • Java 17 이상
  • JJWT 0.12.3
  • Gradle

📦 필요한 의존성

implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'
testImplementation 'org.springframework.boot:spring-boot-starter-test'

각 라이브러리의 역할은?

  • spring-boot-starter-security : Spring Security를 사용하여 인증, 권한 부여, 세션 관리 등 전반적인 보안 기능을 담당
  • jjwt-api : JWT 토큰을 생성하고 검증하는 데 필요한 인터페이스와 기본 클래스들을 제공
  • jjwt-impl : JWT 명세에 따른 실제 구현체를 제공
  • jjwt-jackson : JWT 토큰의 클레임을 JSON으로 직렬화/역직렬화하는 기능을 제공
  • spring-boot-starter-test : 테스트를 위한 의존성

🔒 Security 설정 클래스


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 비밀번호 암호화를 위한 Bean 등록
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // CSRF 보호 비활성화 (JWT 사용 시 필요)
                .csrf().disable()

                // 기본 로그인 폼과 HTTP Basic 인증 비활성화
                .formLogin().disable()
                .httpBasic().disable()

                // URL 접근 권한 설정
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers(
                                "/",
                                "/auth/**"
                        ).permitAll()  // 이 경로들은 모두 접근 가능
                        .requestMatchers("/admin").hasRole("ADMIN") // ADMIN 권한 필요
                        .anyRequest().authenticated() // 그 외 요청은 인증 필요
                )

                // 세션을 Stateless로 설정 (JWT 사용)
                .sessionManagement(session -> 
                        session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                );

        return http.build();
    }
}

@Configuration과 @EnableWebSecurity

@Configuration : Spring의 설정 클래스임을 나타내는 어노테이션

@EnableWebSecurity

  • Spring Security를 활성화하는 어노테이션
  • 커스터마이징된 보안 설정을 적용하기 위해 반드시 포함

BCryptPasswordEncoder Bean

  • 사용자 비밀번호를 암호화하기 위한 객체를 생성
  • 비밀번호를 해시 방식으로 암호화하며, 복호화가 불가능하기 때문에 보안성이 높음

securityFilterChain 메서드

http
    .csrf().disable()
    .formLogin().disable()
    .httpBasic().disable()
    .authorizeHttpRequests(...)
    .sessionManagement(...);

CSRF 보호 비활성화

CSRF는 주로 세션 기반 인증에서 문제가 되는데, JWT를 사용하면 세션을 사용하지 않기 때문에 비활성화해도 문제가 없음

기본 로그인 폼 및 HTTP Basic 인증 비활성화

  • JWT 기반 인증을 사용할 경우, 클라이언트가 직접 토큰을 전송하므로 별도의 로그인 폼이 필요하지 않음
  • HTTP Basic 인증은 JWT를 사용할 경우 필요하지 않으므로 비활성화

세션 관리 설정

SessionCreationPolicy.STATELESS

  • 세션을 생성하지 않도록 설정
  • 모든 요청에서 JWT 토큰을 통해 인증을 수행하며, 서버는 세션 정보를 유지하지 않음

반환값 http.build()

  • Spring Security가 정의한 설정을 기반으로 SecurityFilterChain 객체를 생성해 반환
  • 이 객체는 Spring Security 필터 체인에 등록되어 HTTP 요청을 처리

추가적으로 공부하며 계속 업데이트 해나갈 예정...✍🏻

profile
꿈을 꾸물꾸물 꾸지 말자!

0개의 댓글