HttpOnly 속성을 설정하지 않으면, 클라이언트 측 스크립트에서 쿠키에 접근할 수 있어 XSS 공격에 취약해집니다.HttpOnly 설정을 적용해야 함.HttpOnly 속성을 설정하면, 클라이언트 측 스크립트가 쿠키에 접근할 수 없어 XSS 공격으로부터 Refresh 토큰을 보호할 수 있습니다.Secure 속성: HTTPS를 통해서만 쿠키가 전송되도록 설정하여 MITM(Man-in-the-Middle) 공격을 방지합니다.SameSite 속성: Strict 또는 Lax로 설정하여 CSRF(Cross-Site Request Forgery) 공격을 방지합니다.수정된 CookieUtil.createCookie 예시:
package com.zerobase.user.util;
import jakarta.servlet.http.Cookie;
import org.springframework.stereotype.Component;
@Component
public class CookieUtil {
/**
* HTTPOnly 쿠키 생성
* @param name 쿠키 이름
* @param value 쿠키 값
* @return 설정된 쿠키 객체
*/
public Cookie createCookie(String name, String value) {
Cookie cookie = new Cookie(name, value);
cookie.setHttpOnly(true); // HTTPOnly 설정
cookie.setSecure(true); // HTTPS를 사용하는 경우 Secure 설정
cookie.setPath("/"); // 쿠키가 유효한 경로 설정
cookie.setMaxAge(86400); // 쿠키의 유효 기간 설정 (예: 1일)
cookie.setSameSite("Strict"); // SameSite 설정 (Strict, Lax, None)
return cookie;
}
}
access 헤더)에 포함시켜 전송함으로써, 클라이언트 측 JavaScript가 직접 접근할 수 없도록 함.HttpOnly 속성이 설정되지 않아 보안 취약점이 존재함.사용자 설명:
1. Access 토큰을 응답 헤더에 넣은 이유: JavaScript 접근 방지 및 XSS 공격 보호.
2. Refresh 토큰을 쿠키에 저장한 이유: 브라우저 자동 전송 및 클라이언트의 토큰 관리 불필요.
3. HttpOnly 설정 권장: 쿠키에 저장 시 JavaScript 접근 방지.
4. Refresh 토큰 재발급 시 기존 토큰 삭제: 재사용 방지 및 서버 측 토큰 관리 주도권 확보.
코드 분석:
response.setHeader("access", access);)response.addCookie(cookieUtil.createCookie("refresh", refresh));)ReissueService 클래스에서 refreshRepository.deleteByRefresh(oldRefreshToken);로 기존 토큰 삭제 후 새로운 토큰 저장HttpOnly 속성을 설정하여 JavaScript를 통한 접근을 차단해야 합니다.Secure 속성도 설정하는 것이 좋습니다.String 대신 Date 타입으로 저장하여 시간 비교 및 관리의 용이성을 높입니다.예시:
@Service
public class TokenCleanupService {
private final RefreshRepository refreshRepository;
@Autowired
public TokenCleanupService(RefreshRepository refreshRepository) {
this.refreshRepository = refreshRepository;
}
@Scheduled(cron = "0 0 * * * ?") // 매 시간 정각에 실행
public void removeExpiredTokens() {
refreshRepository.deleteByExpirationBefore(new Date());
}
}
ReissueService에서 기존 Refresh 토큰을 삭제하고 새로운 토큰을 저장하는 로직이 잘 구현되어 있음.issuer(iss)와 audience(aud) 클레임을 설정하고, 서버에서 이를 검증하여 토큰의 신뢰성을 강화합니다.JWT 기반 인증 시스템의 핵심 보안 원칙을 잘 반영하고 있습니다. 특히, Access 토큰을 응답 헤더에 넣는 이유와 Refresh 토큰을 쿠키에 저장하는 이유, 그리고 Refresh 토큰의 재발급 시 기존 토큰을 삭제하여 재사용을 방지하는 접근 방식은 보안적으로 적절한 선택입니다.
추가적으로 고려할 사항:
HttpOnly 속성 설정: Refresh 토큰을 저장하는 쿠키에 반드시 HttpOnly 속성을 설정하여, XSS 공격으로부터 토큰을 보호해야 합니다.Date 타입으로 만료 시간을 관리하고, 만료된 토큰을 주기적으로 삭제하는 로직을 구현해야 합니다.요약: