본문 바로가기

Spring Boot/유저 관리 기능

쿠키와 세션 기반 인증 : 쿠키의 개념과 특성

내가 어려워하는 부분, 세션 기반 인증 / 토큰 기반 인증 / 그리고 쿠키

 

- 쿠키 이름의 유래와 역사적 배경(매직 쿠키)

- 쿠키의 구조, 범위, 생명주기, 브라우저 동작 방식

- HttpOnly, Secure, SameSite, Domain, Path, Max-Age/Expires 등 속성의 의미와 조합


쿠키의 개념, 특성

쿠키는 브라우저가 보관하고 요청마다 자동 전송하는 작은 데이터임

서버는 쿠키를 활용해 무상태(stateless)인 HTTP에서 사용자의 상태(로그인 여부 등)를 복원한다

 

1. 매직 쿠키(Magic Cookie)

매직 쿠키는 유닉스와 네트워크 프로그래밍에서 사용하던 용어로, 프로그램간에 주고받는 해석하지 않는 불투명한 토큰을 의미함

넷스케이프 시절 웹 애플리케이션에서 상태유지를 위해 이 개념을 사용했고, 사용자에게 전해지는 작은 토큰이라는 의미로 쿠키라는 명칭이 널리 퍼졌다고 한다.

포춘 쿠키를 빗대곤 하는데, 작은 과자이지만 안에 작은 쪽지(토큰)이 들어있어 열어보는 사람에게 정보를 전달한다는 느낌

 

* 쿠키는 서버가 부여한다. 브라우저는 이름과 값을 보관하고 전송할 뿐, 내용은 해석하지 않는다.

 

 

2. 쿠키의 구조, 속성

기본 형태 : Name=Value

속성은 세미콜론으로 구분된 Key=Value 또는 플래그이다.

Set-Cookie:
SESSIONID=abc123;
Path=/;
Domain=example.com;
Max-Age=1800;
HttpOnly; Secure;
SameSite=Lax;

 

속성 의미 주요 포인트
Name=Value
(SESSIONID=abc123;)
쿠키 이름과 값 값에는 공백, 세미콜론 등 특수문자 금지
필요시 URL 인코딩 권장
Domain
(Domain=example.com;)
쿠키가 전송될 도메인 범위 미설정시 호스트 전용
설정시 해당 도메인 및 하위 도메인에 전송
Path
(Path=/;)
전송 경로 제한 접두 경로(prefix) 매칭
보통 / 를 권장함
Expires 만료시각(절대) 표준화된 GMT 날짜 문자열
Max-Age
(Max-Age=1800;)
만료까지 남은 시간(초) Max-Age가 있으면 Expires보다 우선됨
Secure
(Secure;)
HTTPS 연결에서만 전송함 민감한 쿠키는 필수임
HttpOnly
(HttpOnly;)
JS 접근 차단 XSS 완화
인증 쿠키에 강력 권장
SameSite
(SameSite=Lax;)
크로스 사이트 전송 제어 Lax가 기본
SSO나 외부 리디렉션은 None + Secure
Priority(브라우저별로 상이) 제어 우선순위 힌트 용량 초과시 폐기 우선순위에 영향

 

 

쿠키 이름 접두사

접두사 요구조건 효과
__Secure_ Secure 필수 보안 전용임을 표현하는 관례임
__Host- Secure 필수, Path=/ , Domain 금지 호스트가 고정임
하위 도메인 오남용 차단에 유용함

 

 

3. 브라우저의 쿠키 처리 흐름

쿠키 처리 흐름

 

서버가 브라우저에게 Set-Cookie 헤더를 전송함

브라우저가 쿠키 저장소에 보관함

동일 도메인과 경로에 일치하면 Cookie 헤더를 브라우저가 서버에게 전송함

서버는 쿠키 값으로 사용자의 상태를 복원함

서버가 브라우저에 응답을 반환해줌

 

?

 

* 도메인/경로 매칭에 부합하는 요청에만 자동으로 전송되게끔 한다

* 동일 이름의 쿠키가 경로나 도메인에 따라 여러개 존재할 수 있음. 브라우저 구현 차가 있으므로 혼동을 피할것

 

 

4. 생명주기와 용량 제한

세션 쿠키 : Expires / Max-Age 미지정. 브라우저 종료시 삭제됨

영속 쿠키 : 만료 정보를 지정함. 지정된 시간까지 유지됨

용량 : 브라우저마다 다르나 쿠키 하나에 약 4KB, 도메인당 수십개 수준이 일반적이라고 함. 초과시 오래된 쿠키부터 삭제될 수 있음

 

 

 

5. 도메인과 경로 매칭 규칙

Domain 미설정 : 호스트 전용 쿠키임, 정확히 일치하는 호스트에서만 전송함

Domain=example.com 설정 : sub.example.com 포함 하위 도메인에도 모두 전송됨

Path=/account : /acount와 그 하위 경로에만 전송되게끔 함

 

권장하는 인증 쿠키 방식은

호스트 전용 + Path=/ + __Host- 접두사로 범위를 최소화하는 것임

 

 

 

6. 실습 디렉토리 구조

  • root/
    • src/
      • main/
        • java/
          • auth/
            • CookieUtil.java : 쿠키 파서, 빌더
            • SessionStore.java : In-memory 또는 Redis 인터페이스
            • CsrfProtector.java : CSRF 토큰 발급/검증
            • AuthController.java : 로그인/로그아웃, 보호 리소스 예시

 

 

7. 예제 : 쿠키 세팅과 파싱

진짜 예제임

// 쿠키 설정 예시, 인증 세션 쿠키 발급
String sessionId = UUID.randomUUID().toString();

String cookie = "SESSION=" + sessionId 
	+ "; Path=/" 
    + "; HttpOnly" 
    + "; Secure" 
    + "; SameSite=Lax" 
    + "; Max-Age=1800"; // 마지막은 세미콜론 없는듯
    
response.addHeader("Set-Cookie", cookie);

 

// 요청이 오면 그 요청에서 쿠키 읽기
String cookieHeader = request.getHeader("Cookie"); // 헤더 가져옴
Map<String, String> jar = CookieUtil.parse(cookieHeader); // 파싱함
String session = jar.get("SESSION"); // 세션에 해당하는걸 가져옴

 

// 간단한 파서 예시
class CookieUtil {
	static Map<String, String> parse(String header) {
    	Map<String, String> map = new HashMap<>();
        
        if(header == null) {
        	return map;
        }
        
        for(String pair : header.split(";") {
        	String[] kv = pair.trim().split("=", 2);
            
            if(kv.length == 2) {
            	map.put(kv[0], kv[1]);
            } // if
        } // for
        
        return map;
    }
}

 

 

* 인증 정보는 절대 쿠키값에 직접 넣지 말고, 세션 ID 또는 서명된 토큰만 저장하기

* 민감한 정보가 담긴 쿠키에는 HttpOnly + Secure + SameSite 를 기본값으로 적용함

* 도메인 전역 쿠키 남발 금지. 최소 범위의 원칙을 꼭 지키기

 


정리

항목 핵심 요약
역할 브라우저가 보관, 조건에 맞으면 자동 전송하는 작은데이터 
이름의 유래 매직 쿠키에서 차용된 불투명한 토큰 개념
범위 Domain, Path로 제한함. 호스트 전용 권장
보안 HttpOnly, Secure, SameSite 등 필수 검토
용량 / 만료 하나에 약 4KB, Max-Age / Expires로 만료를 제어함