1. OAuth2 보안
OAuth2란?
•
권한 위임 프로토콜이다. (사용자 대신 타사 앱이 리소스 접근 가능)
•
흔히 말하는 카카오 로그인, 구글 로그인이 OAuth2 기반이다.
OAuth 흐름 (Authorization Code Grant 기준)
1.
사용자 ⇒ 구글 로그인 요청
2.
구글 로그인 성공 후 인가 코드 (Auth Code) 발급
3.
애플리케이션이 인가 코드를 사용해 액세스 토큰 요청
4.
액세스 토큰으로 API 호출 (ex: 사용자 프로필 조회)
보안 이슈와 대응법
취약점 | 대응 방법 |
인가 코드 탈취 | PKCE (Proof Key for Code Exchange) 사용 |
리디렉션 URL 변조 | Redirect URI 검증 필수 |
토큰 탈취 | 토큰에 짧은 만료시간 + HTTPS 필수화 |
핵심:
"OAuth2에서는 인가 코드 탈취 방지를 위해 PKCE를 사용하고, 토큰은 짧게 만료시켜 HTTPS로 암호화한다.”
2. JWT 토큰 보안 이슈와 해결법
JWT란?
•
Json Web Token: 인증, 인가 정보를 담은 자기 포함형 토큰
•
보통 헤더.페이로드.서명 형태로 구성됨
JWT의 보안 이슈
문제 | 설명 |
JWT는 서명 검증만 하기 때문에 탈취되면 막을 방법 없음 | |
토큰 유출 시 피해가 오래 감 | |
기본 JWT는 세션리스라서 서버 저장소가 없음 |
해결책
해결 방법 | 설명 |
보통 15분 내외 권장 | |
액세스 토큰 짧게, 리프레시 토큰은 길게 관리 | |
강제 로그아웃·무효화 구현 가능 |
핵심:
"JWT는 탈취 시 위험하므로 액세스 토큰은 짧게, 리프레시 토큰은 서버 저장소(Redis 등)로 관리해 무효화할 수 있도록 한다."
3. Spring Security 커스터마이징
기본 구조
•
Filter Chain 기반 → 요청이 들어오면 여러 필터를 통과하며 인증, 인가 수행
커스터마이징 포인트
커스터마이징 영역 | 방법 |
UsernamePasswordAuthenticationFilter 대체 | |
AccessDecisionVoter 또는 AuthorizationManager 구현 | |
OncePerRequestFilter 상속해 등록 | |
AuthenticationSuccessHandler 구현 |
예시: JWT 필터 추가
public class JwtAuthenticationFilter extends OncePerRequestFilter {
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = resolveToken(request);
if (token != null && jwtProvider.validateToken(token)) {
Authentication auth = jwtProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
}
Java
복사
등록 방법
http.addFilterBefore(new JwtAuthenticationFilter(jwtProvider), UsernamePasswordAuthenticationFilter.class);
Java
복사
핵심:
"Spring Security에서 커스텀 JWT 인증을 구현하려면 OncePerRequestFilter로 필터를 만들고, SecurityContext에 인증 객체를 넣어준다."
4. 정리
주제 | 면접용 핵심 키워드 |
OAuth2 | PKCE, Redirect URI 검증, 짧은 만료시간 |
JWT | 탈취 위험, 액세스/리프레시 분리, 서버측 무효화 |
Spring Security 커스텀 | Filter Chain, OncePerRequestFilter, SecurityContext |