철통 보안과 JWT 로그인
웹 서비스에서 사용자의 비밀번호는 반드시 암호화(BCrypt 등)되어 저장되어야 하며, 허가되지 않은 사용자는 API에 접근할 수 없어야 합니다. Spring Security는 가장 강력한 보안 프레임워크이며, 최근에는 토큰 기반인 JWT를 함께 사용하는 것이 국룰입니다.
| 개념 |
설명 |
| 인증 (Authentication) |
당신이 누구인지 확인하는 과정 (아이디/비밀번호 확인) |
| 인가 (Authorization) |
당신에게 해당 API에 접근할 권한이 있는지 확인하는 과정 (ADMIN vs USER) |
| JWT (JSON Web Token) |
서버가 상태(세션)를 유지하지 않고, 클라이언트가 가진 암호화된 토큰으로 인증하는 현대적 방식 |
실전 코딩: SecurityFilterChain 설정
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable()) // REST API에서는 CSRF 비활성화
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) // JWT 사용 시 세션 끔
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**", "/login", "/signup").permitAll() // 누구나 접근 가능
.anyRequest().authenticated() // 그 외 API는 토큰(인증) 필수
);
return http.build();
}
}
GET /api/private/data (토큰 없이 요청 시)
// Response (401 Unauthorized)
{
"timestamp": "2024-05-25T12:00:00.000+00:00",
"status": 401,
"error": "Unauthorized",
"path": "/api/private/data"
}