Spring Security10 CORS 에러 한 번에 끝내기: Spring Security 6 + 프록시(Nginx) 조합 CORS 에러 한 번에 끝내기: Spring Security 6 + 프록시(Nginx) 조합프로덕션에서 발생하는 CORS(교차 출처) 오류의 7~8할은 설정 위치가 겹치거나 엇갈린 데서 옵니다.이 글은 Spring Security 6 기반 백엔드와 Nginx 리버스 프록시 조합에서하나의 진실된 CORS 설정(Single Source of Truth)을 만드는 실전 가이드입니다.1) 문제 증상 정리 Response to preflight request doesn't pass access control check 프론트는 OPTIONS 예비요청(Preflight)으로 403/404, 서버 로그는 조용함 로컬(프록시 없음)에서는 되는데 운영(프록시 있음)에서만 실패핵심은 Preflight(OPTIONS).. 2025. 10. 17. 감사 로깅/Audit: 로그인 실패·권한거부 탐지 규격 감사 로깅/Audit: 로그인 실패·권한거부 탐지 규격인증/인가는 성공보다 실패가 더 중요합니다. 로그인 실패(401)와 권한 거부(403)는 침해 징후를 가장 먼저 알려주는 신호입니다. 이 글은 Spring Security 6 기준으로 감사 로깅 표준과 구현 코드(핸들러/이벤트/필터/로거 분리)를 제시합니다.1) 로거 분리: 보안 감사를 별도 파일로 logs/security-audit.log logs/security-audit.%d{yyyy-MM-dd}.log 30 %d{ISO8601} %X{traceId} %-5level %logger - %msg%n 운영팀이 security-audit.log만 별도로 수집/알림할 .. 2025. 10. 15. 리소스 서버 분리 & API Gateway 연동(Spring Cloud Gateway) 리소스 서버 분리 & API Gateway 연동(Spring Cloud Gateway)단일 애플리케이션에서 모놀리식으로 인증/인가를 처리하다가 게이트웨이 + 마이크로서비스 구조로 바꾸면, 어디에서 인증을 검증하고 권한을 어떻게 전파할지가 핵심 이슈가 됩니다. 이 글은 Spring Cloud Gateway를 프런트 도어로 두고, 백엔드는 Resource Server(JWT)로 나누는 실전 패턴을 제공합니다.1) 기본 전략: “게이트웨이도 검증, 백엔드도 검증”게이트웨이: Authorization: Bearer ...를 받아 JWT 유효성을 1차 검증(만료/서명/클레임).백엔드(리소스 서버): 게이트웨이를 통과한 요청이라도 다시 검증합니다. 서비스 간 직접 호출, 내부 노출 등 우발적 바이패스를 막습니다.권.. 2025. 10. 15. 권한 모델링: ROLE vs 권한 문자열, @PreAuthorize, 도메인 권한 권한 모델링: ROLE vs 권한 문자열, @PreAuthorize, 도메인 권한서비스가 커질수록 “누가 무엇을 할 수 있는가”를 명확하게 정의해야 합니다. Spring Security에서는 ROLE_* 기반의 역할(Role)과 임의 문자열 기반의 권한(Authority)을 함께 사용할 수 있습니다. 이 글은 역할=상위 그룹, 권한=세부 행위로 나눠 설계하고, @PreAuthorize와 도메인 권한(문서 소유자/조직 등)에 맞춰 검증하는 패턴을 정리합니다.1) 역할 vs 권한: 언제 무엇을 쓰나ROLE: “관리자/매니저/사용자”처럼 사람 그룹. URL 단위 접근 제어에 적합. hasRole("ADMIN")Authority: “게시글:읽기/쓰기/삭제”처럼 구체 행위. 메서드/도메인 제어에 적합. hasAu.. 2025. 10. 14. OAuth2 로그인(Google/GitHub) + JWT 브릿지 OAuth2 로그인(Google/GitHub) + JWT 브릿지소셜 로그인을 도입하면 가입 장벽을 낮출 수 있습니다. oauth2Login으로 Google/GitHub 인증을 처리하고, 로그인 성공 시 우리 서비스의 JWT를 발급해 SPA/모바일과 자연스럽게 연동하는 “브릿지” 패턴을 구현해봅니다.1) 의존성 & 클라이언트 등록// build.gradle.ktsdependencies { implementation("org.springframework.boot:spring-boot-starter-oauth2-client") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springfr.. 2025. 10. 13. JWT 심화: 만료/클레임/키 회전 + 4편과의 연결 전략 JWT 심화: 만료/클레임/키 회전 + 4편과의 연결 전략4편에서 세션 기반 vs Stateless를 비교했죠. 이 글은 Stateless 쪽의 핵심인 JWT를 깊게 파고듭니다. 만료·클레임·키 회전(kid)을 설계하고, RS256 + JWK로 검증 키를 안전하게 배포하는 방법을 예제로 보여줍니다. 목표는 “다중 인스턴스/다중 서비스 환경에서도 안전하고 예측 가능한 토큰 수명 관리”입니다.1) Access/Refresh TTL 전략Access: 5–30분(짧게). 탈취 피해 축소와 빠른 회전을 위해.Refresh: 7–30일(길게). 서버 저장소(DB/Redis)에 유지해 강제 로그아웃/블랙리스트 가능.재발급 시 회전(rotating): 사용된 Refresh는 즉시 폐기하고 새 Refresh 발급.2) .. 2025. 10. 13. 이전 1 2 다음