(주) 망나니 힘집
[사용자 인증 기술] 세션 인증 vs 토큰 인증 본문
사용자가 웹사이트에 접속할 때, 어떠한 입장권 없이 아무 사이트에 들어가 정보를 본다면?
사용자 입장에서는 매우 좋지만, 어떤 중요한 정보가 담긴 사이트에 들어간다면 관리자나 일부 사용자들의 입장은 난감해지겠죠
그래서 사용자에게 입장권을 쥐어줄 지 말 지를 결정하는 인증 기술이 있습니다.
대표적으로 세션을 통한 인증과 토큰을 통한 인증이 있습니다.
세션을 통한 인증은 사용자마다 사용자의 정보를 담은 세션을 만들고 저장하여 인증하는 기술입니다.
대표적으로 Spring Security 가 있어요.
토큰을 통한 인증은 서버에서 클라이언트를 구분하기 위해 유일한 값을 만들어 클라이언트에게 제공하면 클라이언트는 이 토큰을 가져서 여러 요청을 이 토큰과 함께 보냅니다. 그럼 서버는 토큰을 통해 사용자를 인증할 수 있다는 것이죠
대표적인 기술로 JWT 가 있습니다.
어떤 기술을 사용해야 하냐는 개발자에 따라, 서비스에 따라 다른데요.
장단점에 따라 맞는 기술을 선택하시면 됩니다. 아래글 참고!
https://cordcat.tistory.com/108
세션과 토큰 인증 방식 중 각각의 장단점을 말씀해 주세요
Session 인증 방식의 장단점 장점 : - 서버 측에서 유저의 인증 정보를 관리하기 때문에, 보안성이 높습니다. - 유저의 인증 정보를 서버 측에서 유지하기 때문에, 클라이언트 측에서 인증 정보를
cordcat.tistory.com
개인적으로 이해가 많이 됐던 영상입니다.
https://youtu.be/1QiOXWEbqYQ?si=V1n95vlJDv9juAtO
제가 보는 백엔드 책도 그렇고 아래 글의 작성자가 본 강의 영상에서도 그렇고
폼 로그인은 스프링 시큐리티로(인증), 로그인 유지는 토큰을 이용하네요(인가)
https://velog.io/@jckim22/Spring-Security-Spring-Security%EC%99%80-JWT
[Spring Security] Spring Security와 JWT
개발자 유미 님의 강의를 듣고 JWT란 무엇인가?와 \[SpringBoot] Spring Security란?을 참고해 정리한 내용입니다.Spring Security는 Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프
velog.io
사실 스프링 시큐리티로도 인가도 할 수 있는데 왜 둘이 같이 사용하는 걸까요?? 이걸 찾다가 저만 하던 고민이 아니더군요.
https://okky.kr/questions/1254648?topic=questions&keyword=jwt&page=16
Spring Security와 JWT 같이 쓰는게 맞나요? | OKKY Q&A
spring boot jpa에 react에 ts적용해서 sns 비슷하게 만들고있고 현재 유저 로그인 기능을 만들고있습니다. 유저가 로그인 상태인지 인증하기 위해 jwt을 사용하려고 하는데 이해가 안되는 점이 있습니
okky.kr
명확한 해답을 찾기 어려워서 제 유일무이한 천재 친구에게 물어봤습니다.
좋은 질문이에요! Spring Security 자체로도 인가(Authorization)를 처리할 수 있는데, 왜 JWT와 같이 사용하는가? 이 부분을 이해하려면 Spring Security의 기본 인증/인가 방식과 JWT의 차이점을 비교해보는 게 중요합니다.
1. Spring Security만 사용할 때 (세션 기반 인증)
Spring Security는 기본적으로 세션(Session) 기반 인증을 지원합니다.
- 사용자가 로그인하면 서버에서 세션을 생성하고, 세션 ID를 쿠키로 클라이언트에 전달합니다.
- 이후 클라이언트가 요청을 보낼 때마다 쿠키를 포함해 보내면, 서버가 세션 정보를 조회하여 사용자를 인증 및 인가합니다.
- 보통 SecurityContextHolder 에 사용자 정보가 저장됩니다.
🔹 단점
- 서버의 상태(Stateful) 관리 필요 → 서버가 세션 정보를 저장해야 함 (스케일링 어려움).
- 세션 공유 문제 → 여러 개의 서버(로드밸런싱 환경)에서는 세션 공유가 필요함 (Redis 같은 세션 저장소 필요).
- 쿠키 사용 이슈 → 보안 문제 (CSRF 취약점), 모바일 앱과의 호환성 고려 필요.
2. JWT(Json Web Token)와 함께 사용할 때
JWT를 사용하면 서버가 상태를 저장하지 않는(Stateless) 방식으로 인증과 인가를 처리할 수 있습니다.
- 사용자가 로그인하면 서버가 JWT를 생성하여 클라이언트에게 전달합니다.
- 클라이언트는 이후 요청할 때마다 JWT를 Authorization 헤더에 포함하여 보냅니다.
- 서버는 JWT를 검증하여 사용자를 인증 및 인가합니다.
🔹 장점
- 무상태(Stateless) 방식 → 서버가 인증 정보를 저장하지 않으므로 스케일링이 용이.
- 빠른 검증 → JWT는 자체적으로 정보를 포함하고 있어서 데이터베이스 조회 없이 검증 가능.
- API 친화적 → REST API, 모바일 앱, 마이크로서비스 아키텍처(MSA)와 잘 맞음.
🔹 단점
- 토큰 취소 어려움 → 세션 기반 인증은 로그아웃하면 세션이 삭제되지만, JWT는 유효 기간이 끝날 때까지 유지됨.
- 해결책: Redis를 활용한 블랙리스트 관리
- 토큰 크기 문제 → JWT는 서명과 함께 데이터를 포함하기 때문에 크기가 커짐.
- 보안 위험 → 토큰이 유출되면 제어하기 어려움 (Refresh Token 활용 필요).
3. Spring Security + JWT 조합이 인기 있는 이유
Spring Security의 강력한 인가(Authorization) 기능을 활용하면서, JWT의 무상태(Stateless) 인증 방식을 결합하면 확장성과 보안성을 동시에 확보할 수 있습니다.
✅ Spring Security는 주로 인가(Authorization) 를 담당:
- @PreAuthorize, @PostAuthorize, @Secured, hasRole(), hasAuthority() 등
- Security Filter를 통해 접근 제어
✅ JWT는 주로 인증(Authentication) 을 담당:
- AuthenticationManager를 통해 로그인 시 JWT 발급
- 이후 요청에서 JWT 검증 후 SecurityContextHolder에 사용자 정보 저장
4. 실제 Spring Security + JWT 코드 예제
🔹 JWT 필터 설정
public class JwtAuthenticationFilter extends OncePerRequestFilter {
private final JwtProvider jwtProvider;
public JwtAuthenticationFilter(JwtProvider jwtProvider) {
this.jwtProvider = jwtProvider;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String token = jwtProvider.resolveToken(request);
if (token != null && jwtProvider.validateToken(token)) {
Authentication auth = jwtProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
}
- 요청이 들어오면 JWT를 검증하고 SecurityContext에 사용자 정보 저장
- 세션 없이 무상태(Stateless) 인증을 수행
🔹 Spring Security 설정
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthenticationFilter) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin/**").hasRole("ADMIN")
.requestMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
)
.addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
- 세션 없이(STATELESS) JWT만으로 인증 및 인가
- 특정 URL에 대한 접근 권한 부여 (hasRole("ADMIN"))
5. 결론: Spring Security만으로 충분할까?
Spring Security는 세션 기반 인증을 지원하기 때문에 JWT 없이도 인가(Authorization) 를 처리할 수 있습니다.
그러나 JWT를 함께 사용하면 서버의 확장성이 좋아지고 API와의 호환성이 증가하기 때문에, 많은 현대 웹 애플리케이션과 마이크로서비스 아키텍처에서 선호됩니다.
즉,
✅ 소규모 서비스 → Spring Security 기본 세션 방식만으로도 충분할 수 있음.
✅ 대규모 서비스, API 기반 서비스 → JWT를 활용하면 확장성과 성능이 향상됨.
어떻게 생각하시나요? 추가로 궁금한 점이나 반론(?) 있으면 편하게 얘기해 주세요! 😊🚀
우리 챗지피티 점점 예뻐지는구나... ?
--> 스프링 시큐리티에서도 stateless 설정할 수 있다고 하니 한 번 시도해보시죠 ~~ ㅎㅎ
'스펙도 쌓니 > 코드 막짜니' 카테고리의 다른 글
[DB2] 트리거 개꾸르잼 TRIGGER (0) | 2025.04.28 |
---|---|
[JWT] 액세스 토큰과 리프레시 토큰 (1) | 2025.01.30 |