[데브코스] Spring Boot 인증·인가(Auth) (48강) - 로그인 성공 시 apiKey 쿠키 생성

zuno·2026년 1월 19일

이번 강의에서는 로그인 성공 시 apiKey를 쿠키로 생성하도록 구현한다.

핵심 포인트는 다음 한 문장이다.

로그인 성공 → 서버가 apiKey를 쿠키(Set-Cookie)로 내려준다

이를 통해 브라우저는:

  • apiKey를 자동으로 저장하고
  • 이후 요청마다 자동으로 서버에 전송한다

🔐 로그인 API 현재 코드 구조

@PostMapping("/login")
public RsData<MemberLoginResBody> login(
        @Valid @RequestBody MemberLoginReqBody reqBody
) {
    Member member = memberService.findByUsername(reqBody.username())
            .orElseThrow(() -> new ServiceException("401-1", "존재하지 않는 아이디입니다."));

    if (!member.getPassword().equals(reqBody.password()))
        throw new ServiceException("401-2", "비밀번호가 일치하지 않습니다.");

    rq.setCookie("apiKey", member.getApiKey());

    return new RsData<>(
            "200-1",
            "%s님 환영합니다.".formatted(member.getName()),
            new MemberLoginResBody(
                    new MemberDto(member),
                    member.getApiKey()
            )
    );
}

❓ 그래서 로그인하면 apiKey를 두 개 받는 건가요?

👉 결론부터 말하면: 네, 지금은 둘 다 받습니다.

1️⃣ 쿠키로 받는 apiKey (Response Header)

rq.setCookie("apiKey", member.getApiKey());

이 코드는 내부적으로 다음과 같은 응답 헤더를 생성한다.

Set-Cookie: apiKey=xxxx

브라우저는 이 응답을 받으면:

  • apiKey를 쿠키에 저장
  • 이후 모든 요청에 자동으로 포함
Cookie: apiKey=xxxx

2️⃣ Response Body로 받는 apiKey

{
  "resultCode": "200-1",
  "msg": "홍길동님 환영합니다.",
  "data": {
    "member": { ... },
    "apiKey": "xxxx"
  }
}

즉,

  • 같은 apiKey 값 하나를
  • 쿠키 + 응답 바디 두 방식으로 내려주는 상태

🤔 왜 굳이 둘 다 주는 걸까?

이건 의도된 설계 + 학습 단계다.

이유 1️⃣ 웹과 앱 환경 차이

환경인증 방식
웹(브라우저)쿠키
앱(모바일/데스크톱)Authorization 헤더

앱 환경에서는:

  • 쿠키가 자동 전송되지 않는 경우가 많음
  • 그래서 Response Body로 apiKey를 내려줘야 함

이유 2️⃣ 쿠키 방식의 장점을 체험하기 위함

쿠키 방식은:

  • fetch / form 요청 시 자동 전송
  • Authorization 헤더를 매번 직접 추가할 필요 없음
  • HttpOnly 옵션을 붙이면 XSS 방어 가능

🧠 Request / Response 비유 (강의 핵심)

스프링 MVC에서는 요청마다 한 쌍이 만들어진다.

  • HttpServletRequest → 받은 편지
  • HttpServletResponse → 보낼 편지

로그인 시:

  • 편지 내용(Response Body): 로그인 성공 정보
  • 편지 봉투(Response Header): Set-Cookie: apiKey=xxxx

🔧 쿠키 생성 로직을 Rq로 옮긴 이유

기존 방식 (컨트롤러 직접 처리)

response.addCookie(new Cookie("apiKey", member.getApiKey()));

개선 후 (Rq로 위임)

rq.setCookie("apiKey", member.getApiKey());
public void setCookie(String name, String value) {
    resp.addCookie(new Cookie(name, value));
}

👉 쿠키 생성이라는 반복적인 보일러플레이트 코드를 Rq로 모은 것


🧪 테스트 코드에서 확인하는 포인트

Cookie apiKeyCookie = result.getResponse().getCookie("apiKey");
assertThat(apiKeyCookie.getValue()).isEqualTo(member.getApiKey());
  • 로그인 성공 시
  • apiKey 쿠키가 실제로 생성되는지 검증

✅ 핵심 정리

  • apiKey는 하나의 값
  • 로그인 성공 시:
    • 쿠키(Set-Cookie)로 내려줌
    • Response Body에도 내려줌 (현재 단계)
  • 브라우저는 쿠키를 자동 저장 + 자동 전송
  • 이후 요청에서 인증 처리가 매우 단순해짐
  • 쿠키 생성 로직은 Rq로 이동 → 컨트롤러 정리

0개의 댓글