스프링 Spring
16. Spring Security 기본 개념 및 인증 방식 (JWT, OAuth2, Session 비교)
안녕하세요! 태마입니다.
Spring 기초 강좌입니다.
강좌의 경우
1. 주제 간단 정리
2. 상세 주제 정리
으로 이루어져 있습니다.
스프링 Spring

포스팅 시작하겠습니다 :)
1. 주제 간단 정리
1. Spring Security란?
✔ Spring Security는 Spring 기반 애플리케이션에서 인증(Authentication)과 인가(Authorization)을 처리하는 강력한 보안 프레임워크
✔ 세션 기반 인증, JWT 인증, OAuth2 인증 등 다양한 방식 지원
📌 Spring Security의 주요 기능
사용자 인증(Authentication) | 사용자 로그인 및 신원 확인 |
사용자 인가(Authorization) | 권한(Role) 기반 접근 제어 |
비밀번호 암호화 | BCrypt를 사용한 패스워드 암호화 |
세션 관리 | 로그인/로그아웃 처리 및 세션 유지 |
OAuth2 및 JWT 지원 | OAuth2 인증 및 JWT 기반 토큰 인증 지원 |
📌 Spring Security를 활용하면 "보안이 강화된 애플리케이션을 쉽게 구현 가능"
2. 인증(Authentication)과 인가(Authorization) 개념
✔ 인증(Authentication): 사용자가 누구인지 확인 (예: 로그인)
✔ 인가(Authorization): 사용자가 특정 리소스에 접근할 수 있는 권한이 있는지 확인 (예: 관리자 권한)
📌 인증과 인가의 차이점
인증(Authentication) | 사용자의 신원 확인 | 로그인 시 ID/PW 입력 후 확인 |
인가(Authorization) | 사용자 권한 확인 | 관리자만 특정 페이지 접근 가능 |
📌 Spring Security를 사용하면 "인증과 인가를 쉽게 처리할 수 있음"
✅ 여기까지 Spring Security의 기본 개념과 인증/인가의 차이를 배웠습니다!
👉 "그렇다면, Spring Boot에서 다양한 인증 방식은 어떻게 적용할까?"
✅ 2부에서 세션 기반 인증, JWT 인증, OAuth2 인증을 비교하고 구현하는 방법을 배워봅시다!
2. 상세 주제 정리
1. 세션(Session) 기반 인증
✔ 서버에서 사용자 정보를 세션에 저장하고, 세션 ID를 쿠키로 전달하여 인증 유지
📌 세션 기반 인증 흐름
1️⃣ 사용자가 로그인하면 서버에서 세션을 생성하고, 세션 ID를 클라이언트에 쿠키로 전달
2️⃣ 이후 요청마다 세션 ID를 서버로 전송하여 사용자 인증 유지
3️⃣ 서버가 세션을 관리하고 인증 상태를 확인
📌 Session 기반 인증의 특징
보안성이 높고 자동 로그아웃 가능 | 서버에서 세션을 관리해야 하므로 확장성이 낮음 |
쿠키를 이용하여 클라이언트에서 세션 유지 | 세션 정보가 서버 메모리에 저장되므로 부하 발생 가능 |
📌 Spring Security에서 세션 기반 인증을 쉽게 설정 가능
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(withDefaults()) // 기본 로그인 폼 사용
.logout(logout -> logout.logoutSuccessUrl("/login"));
return http.build();
}
}
✔ 세션을 활용하여 인증을 수행하며, 로그인 및 로그아웃을 처리
📌 세션 기반 인증은 "소규모 프로젝트에서 간단하게 적용 가능"
2. JWT 기반 인증 (JSON Web Token)
✔ JWT는 사용자의 인증 정보를 포함한 토큰을 발급하여, 클라이언트가 요청 시마다 토큰을 전송하여 인증을 수행
📌 JWT 인증 흐름
1️⃣ 사용자가 로그인하면 서버가 JWT 토큰을 발급
2️⃣ 클라이언트는 이후 요청마다 JWT를 헤더에 포함하여 서버에 전달
3️⃣ 서버는 JWT를 검증하여 사용자 인증 수행
📌 JWT 기반 인증의 특징
서버에서 세션을 저장하지 않아 확장성이 높음 | JWT가 탈취되면 보안에 취약 |
RESTful API에 적합한 인증 방식 | JWT가 길어질수록 네트워크 부담 증가 |
📌 Spring Boot에서 JWT 인증을 구현하는 방법
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtTokenProvider {
private static final String SECRET_KEY = "yourSecretKey";
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1일 유효
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
}
✔ JWT를 생성하여 클라이언트에 전달하고, 인증에 활용 가능
📌 JWT 기반 인증은 "무상태 인증을 지원하여 확장성이 뛰어나며, REST API에 적합"
3. OAuth2 인증 (Google, Facebook, GitHub 로그인)
✔ OAuth2는 타사(예: Google, Facebook, GitHub)의 계정을 이용하여 로그인할 수 있도록 지원하는 인증 방식
📌 OAuth2 인증 흐름
1️⃣ 사용자가 Google, Facebook 등의 로그인 페이지에서 인증
2️⃣ 인증이 완료되면 액세스 토큰을 발급받아 클라이언트에 전달
3️⃣ 클라이언트는 액세스 토큰을 사용하여 서버에 사용자 정보를 요청
📌 OAuth2 기반 인증의 특징
타사 인증을 사용하므로 보안이 강화됨 | OAuth2 제공 업체(Google, Facebook 등)에 종속적 |
소셜 로그인을 통해 사용자 접근성이 향상됨 | OAuth2 설정 및 구현이 다소 복잡할 수 있음 |
📌 Spring Security에서 OAuth2 소셜 로그인을 설정하는 방법
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.anyRequest().authenticated()
)
.oauth2Login(withDefaults()); // OAuth2 로그인 활성화
return http.build();
}
}
✔ OAuth2를 활용하여 간편하게 소셜 로그인 지원 가능
📌 OAuth2 인증은 "소셜 로그인 기능이 필요한 서비스에 적합하며, 보안이 강화됨"
✅ 여기까지 Spring Security의 다양한 인증 방식(Session, JWT, OAuth2)을 비교하고 구현 방법을 배웠습니다!
👉 "그렇다면, Spring Boot에서 JWT(Json Web Token) 인증 구현은 어떻게 할까?"
✅ 다음 회차에서 Spring Boot에서 JWT(Json Web Token) 인증 구현을 배워봅시다!
'IT Developer > Spring' 카테고리의 다른 글
Spring 기초 <20. Spring WebFlux와 비동기 프로그래밍 (Reactor, Mono, Flux 개념)> (1) | 2025.04.06 |
---|---|
Spring 기초 <19. Spring Boot에서 API Gateway 및 Rate Limiting 설정 (Rate Limiter)> (0) | 2025.04.05 |
Spring 기초 <18. OAuth2.0 인증 및 소셜 로그인(Google, Facebook, GitHub) 적용> (0) | 2025.04.04 |
Spring 기초 <17. Spring Boot에서 JWT(Json Web Token) 인증 구현> (0) | 2025.04.03 |
Spring 기초 <15. Spring Batch – 대용량 데이터 처리 및 배치 작업 구현> (0) | 2025.04.01 |
Spring 기초 <14. Spring Boot에서 Redis를 활용한 캐싱(Cache) 전략> (1) | 2025.03.31 |
Spring 기초 <13. Spring Boot에서 JPA를 활용한 CRUD 구현> (0) | 2025.03.30 |
Spring 기초 <12. Spring에서 트랜잭션(Transaction) 관리 (@Transactional 활용법)> (0) | 2025.03.29 |