HTTP 프로토콜 환경은 connectionless, stateless한 특성을 가짐 (통신이 끝나면 상태 정보를 유지하지 않음)
- Connectionless
- 클라이언트가 서버에 요청(Request)을 했을 때, 그 요청에 맞는 응답(Response)을 보낸 후 연결을 끊음
- Stateless
- 연결을 끊는 순간 클라이언트와 서버의 통신이 끝나고 상태 정보를 유지하지 않음
- 쿠키와 세션을 사용하여 사용자에 대한 인증 유지 필요
쿠키
- 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일
- 사용자 인증이 유효한 시간을 명시할 수 있으며, 유효 시간이 정해지면 브라우저가 종료되어도 인증 유지
- 이름, 값, 만료일, 경로 정보로 구성
- 클라이언트 로컬에 저장되기 때문에 변질되거나 request에서 스니핑 당할 우려가 있어서 보안에 취약
세션
- 세션은 쿠키를 기반하고 있지만, 사용자 정보 파일을 브라우저에 저장하는 쿠키와 달리 세션은 서버 측에서 관리
- 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지
- 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정 가능
- 클라이언트가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 유일한 ID를 부여하는 데 이것이 세션 ID
- 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높음
세션 id를 응답 쿠키로 전달
클라이언트와 서버는 쿠키로 연결
- 서버는 클라이언트에 mySessionId 라는 이름으로 세션ID 만 쿠키에 담아서 전달
- 클라이언트는 쿠키 저장소에 mySessionId 쿠키를 보관
클라이언트의 세션id 쿠키 전달
- 클라이언트는 요청시 항상 mySessionId 쿠키를 전달
- 서버에서는 클라이언트가 전달한 mySessionId 쿠키 정보로 세션 저장소를 조회해서 로그인시 보관한 세션 정보를 사용
HttpSession
- 쿠키 이름이 JSESSIONID, 값은 추정 불가능한 랜덤 값
- ex) Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
// 세션이 있으면 기존 세션을 반환, 없으면 새로운 세션을 생성해서 반환
request.getSession(true); // request.getSession();
// 세션이 있으면 기존 세션을 반환, 없으면 새로운 세션을 생성하지 않고 null 반환
request.getSession(false);
// 세션에 로그인 회원 정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
// 세션 제거
session.invalidate();
// 로그인 시점에 세션에 보관한 회원 객체를 찾음
session.getAttribute(SessionConst.LOGIN_MEMBER);
@SessionAttribute
// 이미 로그인 된 사용자를 찾을 때 다음과 같이 사용 (세션을 생성하지 않음)
@GetMapping("/")
public String homeLoginV3Spring(
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)
Member loginMember,
Model model) {
// 세션에 회원 데이터가 없으면 home
if (loginMember == null) {
return "home";
}
// 세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
- 세션을 찾고, 세션에 들어있는 데이터를 찾는 번거로운 과정을 스프링이 편리하게 처리
application.properties
// 로그인을 처음 시도하면 URL이 jsessionid를 포함하고 있는 것을 확인 가능
// URL 전달 방식을 끄고 항상 쿠키를 통해서만 세션을 유지하고 싶다?
server.servlet.session.tracking-modes=cookie
세션 타임아웃 설정
server.servlet.session.timeout=60 // 60초, 기본은 1800 (30분)
참고 자료:
쿠키와 세션 개념
노션 페이지(아래 내용과 동일) 개요 쿠키와 세션은 개발자 말고도 인터넷 사용자라면 누구나 많이 들어본 단어입니다. 하지만 개념에 대해서는 많은 사람들이 헷갈려 하기에 쉽고 간단하게 정
interconnection.tistory.com
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
'Spring Boot' 카테고리의 다른 글
API 예외 처리 (0) | 2023.07.12 |
---|---|
서블릿 필터, 스프링 인터셉터 (0) | 2023.07.10 |
Validation (0) | 2023.07.05 |
Thymeleaf - 스프링 통합과 폼 (0) | 2023.07.04 |
Thymeleaf 기본 기능 (0) | 2023.07.02 |