.으로 구분된 세 부분으로 구성된 문자열입니다: Header.Payload.SignatureuserId, username), 권한(roles), 만료 시간(exp) 등 실제 전달할 데이터(Claim)를 담습니다. 민감한 정보(비밀번호 등)는 절대 담아서는 안 됩니다.Authorization 헤더에 JWT를 Bearer 스킴과 함께 담아 보냅니다.Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...401 Unauthorized 에러를 응답합니다.JwtAuthenticationFilter: UsernamePasswordAuthenticationFilter 이전에 위치하는 커스텀 필터를 만들어, 모든 요청의 Authorization 헤더에서 JWT를 추출하고 검증하는 로직을 구현합니다. 토큰이 유효하면, SecurityContextHolder에 인증 정보를 저장하여 이후의 인가(Authorization) 처리가 정상적으로 동작하도록 합니다.SOP (Same-Origin Policy, 동일 출처 정책): 브라우저의 매우 중요한 보안 정책으로, 하나의 출처(Origin)에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호작용하는 것을 제한합니다.
http://localhost:3000)문제점: 현대적인 웹 애플리케이션은 프론트엔드(http://localhost:3000)와 백엔드(http://localhost:8080)의 출처가 다른 경우가 대부분입니다. 이 경우, 프론트엔드에서 백엔드 API를 호출하면 브라우저의 SOP에 의해 차단됩니다.
CORS (교차 출처 리소스 공유):
Access-Control-Allow-Origin과 같은 특정 헤더를 포함하여, "이 출처(http://localhost:3000)에서 오는 요청은 허용해도 괜찮아"라고 브라우저에게 알려주는 방식입니다.Spring Security에서의 CORS 설정: SecurityFilterChain 설정에서 cors() 메서드를 사용하여, 어떤 출처, 어떤 HTTP 메서드, 어떤 헤더를 허용할지 등을 전역적으로 손쉽게 구성할 수 있습니다.
CSRF (사이트 간 요청 위조): 사용자가 특정 웹사이트에 로그인해 있는 상태에서, 공격자가 만든 악의적인 페이지를 방문했을 때, 사용자의 의지와는 상관없이 로그인된 세션을 이용하여 서버에 특정 요청(e.g., 비밀번호 변경, 글 삭제)을 보내도록 위조하는 공격입니다.
공격 원리: 이 공격은 브라우저가 요청을 보낼 때, 해당 도메인에 대한 인증 쿠키(세션 ID 등)를 자동으로 함께 보내는 특징을 악용합니다.
Spring Security의 CSRF 방어:
Stateless API와 CSRF:
csrf().disable())하는 경우가 많습니다.