- 자동 로그인(Remember-Me) 기능이 가지는 보안 위험성
- XSS 공격과 쿠키 탈취 공격의 원리, 방지 방법
- Remember-Me 인증시 민감한 기능에는 재인증을 요구해야하는 이유
- 실무에서 Remember-Me 보안 강화를 위한 패턴 및 전략
Remember-Me 와 보안 위험성
Remember-Me 인증은 편리하지만, 잘못 구현하면 심각한 보안 취약점을 만들 수 있다
특히 사용자의 브라우저에 쿠키를 저장하기 때문에, 쿠키 탈취 공격에 노출될 수 있다
1. 자동 로그인과 공격 시나리오
사용자가 단순히 자동 로그인을 켜뒀을 뿐인데, 쿠키 탈취만으로 계정이 완전히 노출될 수 있다
2. 보안 위험
| 위험 요소 | 설명 |
| 쿠키 탈취 | 브라우저 쿠키를 훔쳐내면, 해커가 그대로 자동 로그인 가능 |
| 세션 고정 공격 | 해커가 미리 발급받은 쿠키를 사용자가 쓰게 만든 후 계정 탈취 |
| 로그아웃 불완전 | 서버에서 Remember-Me 쿠키를 무효화하지 않으면, 탈취된 쿠키는 여전히 유효함 |
팁
- Remember-Me 를 활성화할 땐 반드시 보안 플래그(Secure, HttpOnly) 를 설정해야한다
- 로그아웃 시 서버에서 Remember-Me 쿠키를 무효화하도록 구현해야한다
- Remember-Me 는 편의기능일 뿐, 항상 보안과 균형을 맞춰야한다
| 항목 | 설명 |
| 위험성 | 자동 로그인은 편리하지만, 쿠키 탈취 위험이 존재함 |
| 대응 | Secure, HttpOnly, 로그아웃시 쿠키 무효화 |
XSS 공격과 쿠키 탈취 방지
Remember-Me 기능에서 가장 치명적 보안 위협은
XSS(Cross-Site Scripting) 을 통한 쿠키 탈취임
1. XSS 공격 개념
https://b1uffer.tistory.com/433
해커가 웹페이지에 악성 스크립트를 삽입하여 사용자의 브라우저에서 실행되게 하는 공격
이를 통해 쿠키, 세션 정보, 키 입력 등을 탈취할 수 있다
가령 아래처럼 구현하면 말 그대로 XSS에 의해 탈취당한다
<!-- 사용자가 입력한 값을 그대로 출력 -->
<p>Welcome, <span id="username">${param.username}</span></p>
만약 사용자가 username 파라미터에 <script>alert('hacked')</script> 를 입력한다면, 해당 스크립트가 실행된다
2. 쿠키 탈취 방지 전략
| 방법 | 설명 |
| HttpOnly | 자바스크립트에서 쿠키 접근을 차단함 |
| Secure | HTTPS 연결에서만 쿠키 전송 허용 |
| SameSite | 교차 사이트 요청 시 쿠키 전송 제한 (Lax / Strict 모드 권장) |
예
ResponseCookie cookie = ResponseCookie.from("remember-me", token)
.httpOnly(true) // httpOnly
.secure(true) // secure
.sameSite("Strict") // sameSite
.build();
response.addHeader(HTTPHeaders.SET_COOKIE, cookie.toString());
브라우저에서 Remember-Me 쿠키가 탈취되는 위험을 최소화할 수 있다
팁
- XSS를 근본적으로 차단하려면, 반드시 입력 값 검증과 출력시 이스케이프 처리를 해야한다
- Remember-Me 쿠키는 반드시 HttpOnly 와 Secure 속성을 적용해야한다
- 크로스 사이트 요청 공격(CSRF)와 함께 고려하여, SameSite 옵션도 적극적으로 활용해야한다
| 항목 | 기본 대응 |
| HttpOnly | 자바스크립트 접근 차단 |
| Secure | HTTPS 연결에서만 전송 |
| SameSite | 교차 사이트 요청 차단 |
| 입력 검증 | XSS 공격 근본적 차단 |
민감한 기능에 대한 재인증
Remember-Me 인증은 어디까지나 편의기능임
따라서, 모든 기능을 무조건 Remember-Me 만으로 접근 가능하게 한다면 위험하다
1. 재인증이 필요한 기능
- 비밀번호 변경
- 결제 / 송금
- 개인정보 수정
- 2FA(이중 인증) 설정
Remember-Me 상태에서 위 기능에 접근하려 하면, 반드시 다시 로그인을 요구해야만 한다
2. 예
import org.springframework.security.authentication.RememberMeAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SecureController {
@GetMapping("/change-password")
public String changePasswordPage(Authentication authentication) {
if(authentication instanceof RememberMeAuthenticationToken) {
return "redirect:/login?reauth=true";
}
return "change-password";
}
}
사용자가 Remember-Me 로 로그인한 상태일 경우, 민감한 기능에 접근하려 하면 로그인 페이지로 리다이렉트 하도록 한다
팁
- Remember-Me 는 편의성을 주는 용도이다. 신뢰 인증 수단이 아니다
- 민감한 기능 접근시 반드시 추가 인증을 요구하는 규칙을 적용해야한다
- UX 관점에서는 불편하지만, 보안상 반드시 필요한 절차이다
| 기능 | 재인증 필요 여부 |
| 일반 페이지 조회 | 불필요 |
| 비밀번호 변경 | 필요 |
| 결제 / 송금 | 필요 |
| 개인정보 수정 | 필요 |
'Spring Boot > Security 쿠키,세션 기반 인증,인가' 카테고리의 다른 글
| 세션 기반 사용자 인가 구현 : URL 패턴 기반 인가 설정 (0) | 2026.05.15 |
|---|---|
| 세션 기반 사용자 인가 구현 : 인증과 인가의 관계 (0) | 2026.05.14 |
| Remember-Me : 설정 (0) | 2026.05.12 |
| Remember-Me : 구현 방식 (1) | 2026.05.12 |
| Remember-me : 인증 개념과 필요성 (0) | 2026.05.11 |