자기 전에 GPT랑 스프링 시큐리티 기초 대화

DEV NAHYUN·2025년 3월 19일
0

Spring Security

목록 보기
1/1

업무 관련 내용은 편집함.


👧🏻 아까 스프링 시큐리티의 인증 방법 물어본 거 생각 나?

🤖 아마 인증 방식을 고민하면서,

1. 세션 기반 인증
2. JWT 기반 인증
3. OAuth 2.0 또는 소셜 로그인
4. API Key 또는 Basic Auth

이런 옵션 중에서 어떤 게 적절할지 물어봤던 것 같아.
혹시 이 부분 더 정리해줄까? 아니면 다른 방향으로 고민이 생겼어?


👧🏻 일단 2-1-3-4 순서대로 설명해줄래? 어떤 비즈니스 상황에 쓰는지도. 간략하게 말해줘 더 궁금한건 내가 질문할게.

🤖 ㅇㅋ.

2. JWT 기반 인증

✅ 어떤 상황에서?
REST API 기반 MSA, 모바일/웹 클라이언트 분리된 환경
서버에서 세션을 관리하지 않고, 확장성이 필요한 경우

✅ 코드 예시 (Spring Security + JWT)

// JWT 토큰 생성 (UserDetailsService를 통해 유저 검증)
public String generateToken(String username) {
    return Jwts.builder()
            .setSubject(username)
            .setIssuedAt(new Date())
            .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 1일
            .signWith(SignatureAlgorithm.HS256, secretKey)
            .compact();
}
// JWT 필터 (인증 과정)
public class JwtFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        String token = extractToken(request);
        if (token != null && validateToken(token)) {
            UsernamePasswordAuthenticationToken authentication = 
                new UsernamePasswordAuthenticationToken(getUsernameFromToken(token), null, getAuthorities(token));
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
        chain.doFilter(request, response);
    }
}

1. 세션 기반 인증

✅ 어떤 상황에서?
내부 시스템(ERP, 사내 서비스), 상태 관리가 필요할 때
JWT보다 간단한 구현이 필요할 때

✅ 코드 예시 (Spring Security + 세션 로그인)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated()
        )
        .formLogin(Customizer.withDefaults()) // 기본 로그인 페이지 활성화
        .sessionManagement(session -> session
            .sessionCreationPolicy(SessionCreationPolicy.ALWAYS) // 세션 유지
        );
    return http.build();
}

3. OAuth 2.0 인증

✅ 어떤 상황에서?
소셜 로그인 (구글, 카카오, 네이버 등)
외부 인증 제공자를 활용할 때 (OAuth 서버를 직접 운영할 수도 있음)

✅ 코드 예시 (Spring Security + OAuth2.0 로그인)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated()
        )
        .oauth2Login(Customizer.withDefaults()); // OAuth2 로그인 활성화
    return http.build();
}

4. API Key / Basic Auth

✅ 어떤 상황에서?
외부 시스템 간 연동 (API 호출)
단순한 인증이 필요한 경우

✅ 코드 예시 (Basic Auth)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests(auth -> auth
            .anyRequest().authenticated()
        )
        .httpBasic(Customizer.withDefaults()); // Basic Auth 활성화
    return http.build();
}

👧🏻 1. 세션이 뭔데 왜 쓰는데. 2, 3, 4에선 세션 왜 안쓰는데? 장단점.
2. JWT가 뭔데 왜 쓰는데. 1, 3, 4에선 왜 안쓰는데? 장단점

🤖
1. 세션(Session)이 뭔데? 왜 쓰는데?
👉 서버가 사용자의 로그인 상태를 유지하기 위해 사용하는 저장 공간.

로그인하면 서버가 세션을 만들고, 클라이언트(브라우저)에 JSESSIONID라는 쿠키를 줌.
이후 요청할 때 JSESSIONID 쿠키를 보내면, 서버가 해당 세션을 조회해서 로그인 상태를 유지함.

📌 왜 2, 3, 4에서는 세션을 안 쓰는데?

✅ JWT(2)에서는?

JWT는 토큰을 직접 주고받으면서 인증하므로 서버가 세션을 저장할 필요 없음.
API 서버가 여러 개일 때(JWT는 Stateless), 세션 기반은 부담이 됨(Scale-out 어려움).
✅ OAuth(3)에서는?

OAuth는 외부 인증 제공자가 사용자를 인증하고, 토큰을 제공함.
서버가 로그인 상태를 유지할 필요 없음(토큰 검증만 하면 됨).
✅ API Key/Basic Auth(4)에서는?

API 호출마다 인증 정보를 보내므로 세션 유지가 필요 없음.
RESTful API 원칙: Stateless(상태를 유지하지 않음)

📌 세션 기반 인증의 장단점
✅ 장점

상태 유지: 로그인 후 계속 인증된 상태 유지 가능.
보안성: 세션은 서버에서 관리되므로, 토큰을 클라이언트가 보관하는 JWT보다 안전할 수 있음.
기존 웹 애플리케이션과 잘 맞음 (Spring MVC + JSP 같은 전통적인 웹 서비스).

❌ 단점

확장성 문제(Scale-out 어려움): 서버 여러 대가 필요하면 세션 동기화(Sticky Session, Redis 등)를 해야 함.
모바일/SPA에는 불리함: API 서버와 프론트엔드가 분리된 경우, 클라이언트가 세션을 관리하기 어려움.

2. JWT(Json Web Token)가 뭔데? 왜 쓰는데?
👉 사용자의 인증 정보를 포함한 토큰(JSON 형식)을 서버가 발급하고, 클라이언트가 요청마다 보냄.

서버는 JWT를 검증하고 인증된 사용자만 API를 사용할 수 있도록 함.
세션 없이 Stateless(상태 유지 X) 하므로 서버 부담이 적음.

📌 왜 1, 3, 4에서는 JWT를 안 쓰는데

✅ 세션(1)에서는?

웹 애플리케이션(ERP, 전통적인 웹)에서는 상태 유지가 중요해서 JWT보다 세션이 더 적절함.
JWT는 매 요청마다 토큰을 검증해야 하므로 서버 리소스 부담이 클 수 있음.
✅ OAuth(3)에서는?

OAuth 자체가 인증을 제공하는 방식이므로, JWT 없이도 OAuth 토큰을 활용할 수 있음.
OAuth에서 JWT를 쓰기도 하지만, OAuth = JWT는 아님.
✅ API Key/Basic Auth(4)에서는?

API Key는 단순한 키 값만 전달하면 되므로 JWT처럼 토큰을 생성하고 검증할 필요 없음.
Basic Auth는 사용자명/비밀번호를 매번 보내기 때문에 JWT 필요 없음.

📌 JWT 인증의 장단점
✅ 장점

Stateless: 세션 저장소 필요 없음 → 확장성 뛰어남.
모바일/SPA와 잘 맞음: API 서버와 클라이언트가 분리된 환경에서 적절.
다중 서버(분산 시스템)에서 유리: 서버 간 세션 공유 필요 없음.

❌ 단점

보안 취약점: 토큰이 노출되면 누구나 사용할 수 있음(탈취 위험 → HttpOnly/Secure 설정 필요).
갱신 어려움: 세션 기반처럼 상태를 유지하는 게 아니라, JWT가 만료되면 재발급 필요함(리프레시 토큰 필요).
토큰 크기 문제: 세션보다 데이터가 커질 수 있음(서버가 저장하는 것이 아니라 클라이언트가 보관).


profile
나만 알아보면 된다는 마음으로 작더라도 조금씩

0개의 댓글

관련 채용 정보