로그인 기능을 구현하면서 HttpServletRequest, HttpSession, @RequestHeader, @SessionAttribute가 자주 등장한다. 이름도 비슷하고 역할도 헷갈리기 쉬워서 각각의 역할을 정리해보았다.
1. HttpServletRequest
무엇인가?
클라이언트(브라우저)가 서버로 보낸 HTTP 요청 전체를 담고 있는 객체이다.
쉽게 말하면, "사용자가 서버에게 보낸 모든 정보가 들어있는 상자" 라고 생각하면 된다.
예를 들어 사용자가
POST /login
을 요청했다면,
- 요청 URL
- 요청 방식(GET, POST)
- 요청 헤더
- 쿠키
- 세션
- Body(JSON)
등 모든 정보를 HttpServletRequest가 가지고 있다.
사용할 수 있는 예시
request.getParameter(...)
request.getHeader(...)
request.getSession()
request.getCookies()
요청과 관련된 거의 모든 정보를 얻을 수 있는 객체이다.
2. HttpSession
무엇인가?
세션은 "사용자 한 명의 정보를 서버가 잠시 기억해두는 공간"이다.
예를 들어 로그인을 하면
사용자 A 로그인 성공
이라는 사실을 서버가 기억해야 한다.
이때 사용하는 것이 Session이다.
예시
Session
├── loginUser
└── cart
로그인 성공 후
loginUser → 사용자 정보
를 저장해두면, 이후 요청에서는
이 사용자는 로그인한 사람이다.
라고 판단할 수 있다.
자주 사용하는 메서드
값 저장
session.setAttribute("loginUser", sessionUser);
값 조회
session.getAttribute("loginUser");
삭제
session.invalidate();
3. @RequestHeader
무엇인가?
HTTP 요청 헤더의 값을 바로 받아오는 어노테이션이다.
예를 들어
Authorization: Bearer xxxx
또는
User-Agent
같은 Header 값을 사용할 때 사용한다.
예시
@GetMapping
public void test(
@RequestHeader("User-Agent") String userAgent
) {
}
브라우저가 보낸
User-Agent
값이 그대로 들어온다.
언제 사용할까?
대표적으로
- JWT 토큰
- API Key
- 브라우저 정보
- Content-Type
등을 읽을 때 사용한다.
4. @SessionAttribute
무엇인가?
Session에 저장되어 있는 값을 바로 꺼내오는 어노테이션이다.
예를 들어 로그인 시
session.setAttribute("loginUser", sessionUser);
를 저장했다면 컨트롤러에서는
@SessionAttribute("loginUser")
SessionUser sessionUser
만으로 바로 가져올 수 있다.
예시
@PostMapping("/logout")
public void logout(
@SessionAttribute("loginUser") SessionUser user
) {
}
별도로
session.getAttribute(...)
를 호출하지 않아도 된다.
required 옵션
@SessionAttribute(
name = "loginUser",
required = false
)
처럼 사용할 수 있다.
required = true (기본값)
세션이 없으면 예외 발생
required = false
세션이 없으면
null
이 들어온다.
그래서
if (sessionUser == null) {
...
}
같은 처리가 가능하다.
HttpServletRequest vs HttpSession
HttpServletRequestHttpSession
| 요청 정보를 담는다 | 사용자 정보를 기억한다 |
| 요청마다 새로 생성 | 로그인 동안 유지 |
| Header, Body, URL 등을 읽는다 | 로그인 정보 등을 저장한다 |
HttpSession vs @SessionAttribute
둘 다 Session을 사용하지만 역할이 조금 다르다.
HttpSession
직접 저장하거나 직접 꺼낼 때 사용한다.
session.setAttribute(...)
session.getAttribute(...)
@SessionAttribute
이미 Session에 저장된 값을
자동으로 꺼내준다.
@SessionAttribute("loginUser")
처럼 사용할 수 있다.
한눈에 정리
기능사용하는 것
| 요청 전체 보기 | HttpServletRequest |
| 로그인 정보 저장 | HttpSession |
| Header 읽기 | @RequestHeader |
| Session 값 자동 조회 | @SessionAttribute |
기억하기 쉬운 비유
- HttpServletRequest → 택배 상자 (사용자가 보낸 모든 정보)
- HttpSession → 사물함 (사용자 정보를 잠시 보관)
- @RequestHeader → 택배 상자의 송장만 확인
- @SessionAttribute → 사물함에서 물건을 바로 꺼내오기
'TIL' 카테고리의 다른 글
| JPA N+1 문제란? (왜 생기고 어떻게 해결할까?) (0) | 2026.07.15 |
|---|---|
| [트러블슈팅] 고객 조회 시 주문 통계(총 주문 수 / 총 구매 금액) 추가하기 (0) | 2026.07.14 |
| Java 리스트(List) 활용 & 반복문 리팩토링 (0) | 2026.06.23 |
| 람다(Lambda)와 스트림(Stream) 간단 정리 (0) | 2026.06.22 |
| Java - Enum으로 문자열 입력값과 연산자를 매칭하기 (0) | 2026.06.19 |