이번 강의에서는 로그인 성공 시 apiKey를 쿠키로 생성하고,
보안을 위해 path=/, HttpOnly=true 옵션을 추가하는 과정을 다룬다.
또한 테스트 코드와 Postman을 통해
쿠키가 실제로 생성되고, 응답에 포함되는지를 검증한다.
@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", "비밀번호가 일치하지 않습니다.");
// 로그인 성공 시 apiKey 쿠키 생성
rq.setCookie("apiKey", member.getApiKey());
return new RsData<>(
"200-1",
"%s님 환영합니다.".formatted(member.getName()),
new MemberLoginResBody(
new MemberDto(member),
member.getApiKey()
)
);
}
✔ 로그인 성공 시 apiKey를 쿠키로 내려준다
✔ 동시에 응답 바디에도 apiKey가 포함되어 있다
public void setCookie(String name, String value) {
Cookie cookie = new Cookie(name, value);
cookie.setPath("/"); // 모든 경로에서 쿠키 전송
cookie.setHttpOnly(true); // 자바스크립트 접근 차단
resp.addCookie(cookie);
}
| 옵션 | 의미 |
|---|---|
| path=/ | 모든 API 요청에 쿠키가 포함됨 |
| HttpOnly=true | document.cookie로 접근 불가 |
| 자동 전송 | fetch, form 요청 시 자동 포함 |
resultActions.andExpect(
result -> {
Cookie apiKeyCookie = result.getResponse().getCookie("apiKey");
assertThat(apiKeyCookie.getValue()).isEqualTo(member.getApiKey());
assertThat(apiKeyCookie.getPath()).isEqualTo("/");
assertThat(apiKeyCookie.isHttpOnly()).isTrue();
}
);
✔ 쿠키 값이 apiKey와 동일한지
✔ path가 /인지
✔ HttpOnly가 true인지 검증
Set-Cookie: apiKey=xxxx-xxxx-xxxx
| 항목 | 값 |
|---|---|
| Name | apiKey |
| Domain | localhost |
| Path | / |
| HttpOnly | true |
| Secure | false |
| Expires | Session |
✔ 응답 바디
✔ 응답 헤더
➡ 쿠키와 apiKey 값은 동시에 내려온다
브라우저 환경
→ 쿠키 자동 전송 활용
보안 강화
→ HttpOnly로 JS 접근 차단
모든 API에 쿠키 포함
→ path=/ 설정
50강: 이제 어떠한 요청이라도 apiKey 쿠키변수가 동행합니다.