본문 바로가기

Spring Boot/Security 쿠키,세션 기반 인증,인가

Remember-Me : 보안

 - 자동 로그인(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 상태에서 위 기능에 접근하려 하면, 반드시 다시 로그인을 요구해야만 한다

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 관점에서는 불편하지만, 보안상 반드시 필요한 절차이다

 

기능 재인증 필요 여부
일반 페이지 조회 불필요
비밀번호 변경 필요
결제 / 송금 필요
개인정보 수정 필요