세션과 쿠키 : Spring Boot를 활용한 세션 관리와 자동 로그인 구현

2024. 6. 16. 10:19Language/Java

1. 서론

웹 사이트에 로그인한 후 며칠 뒤에 다시 접속하면 자동으로 로그인되는 경우가 있다.

반면, 몇 분간 사이트를 사용하지 않으면 세션이 만료되어 다시 로그인해야 하는 경우도 있다.

이는 사용자의 브라우저에 정보를 저장하는 세션과 쿠키의 인증 방식과 관련있다.

 

 

2. HTTP 특성과 세션, 쿠키의 필요성

 

2.1 HTTP 특성

  • 비연결성 : 클라이언트가 요청한 후 응답을 받으면 연결을 끊어버림
  • 무상태 : 통신이 끝나면 상태를 유지

2.2 세션과 쿠키의 도입

쿠키와 세션은 HTTP의 특성을 보완하기 위해 사용되는 기술이다.


3. 쿠키 개념 및 문제점

 

3.1 쿠키

쿠키는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각으로 사용자의 방문 정보, 로그인 여부 등을 저장하는 데 사용된다. HTTP 헤더에 포함되어 클라이언트의 모든 요청과 함께 전송된다.

서버는 쿠키 정보를 통해 사용자를 식별하고 이전 요청과의 연관성을 유지할 수 있다.

 

3.2 쿠키의 문제점

보안 취약성, 제한된 크기, 브라우저 설정 변경 가능 등이 있다.

매 요청마다 헤더에 쿠키를 넣어 전달하여 인증하는 방식은 유출 등 보안상 결함이 존재한다.


4. 세션 개념 및 특징

4.1 세션

 

  • 세션은 웹 브라우저가 종료되기 전까지 같은 사용자로부터 오는 일련의 요청을 하나의 상태로 보고 일정하게 유지하는 기술입니다.
    • 즉, 사용자가 로그인 후 여러 페이지를 이동하더라도 로그인 상태를 유지할 수 있도록 합니다.
  • 세션은 서버 측에 사용자 인증 정보를 저장하고, 사용자 식별을 위한 고유 ID(JSESSIONID)를 쿠키에 담아 전송하는 방식으로 작동합니다.

4.2 세션의 특징

  • 인증정보 보호: 사용자 인증 정보는 서버 측에 저장되므로 쿠키에 비해 보안성이 높습니다.
  • 상태 유지: 로그인 상태, 방문 기록 등 사용자의 작업 상태를 유지할 수 있습니다.
  • 브라우저 종료 후 제거: 브라우저가 종료되면 세션 정보가 함께 삭제됩니다.
  • (단점) 서버 메모리 부담: 사용자가 많아질수록 세션 정보를 저장하기 위해 서버 메모리가 많이 사용될 수 있습니다.

 

4.3 세션의 동작 순서

 

 

1. 클라이언트가 로그인 정보를 서버에 보냄

2. 서버는 db에서 유저정보 확인함

3. 유저 정보가 확인되면 서버는 세션 저장소에 세션을 생성함

4. 세션 저장소는 session id를 발급하여 서버에 전달함

5. 서버는 session id를 클라이언트에 응답 값을 보냄

6. 클라이언트는 받은 session id를 웹 브라우저의 쿠키에 저장

7. 이후 클라이언트가 로그인 인증이 필요할 때 쿠키에 저장된 session id를 서버에 전송함


5. Spring Boot 세션 사용 예제

 

사용하는 어노테이션

  • @SessionAttirtubes : @ModelAttribute 또는 model.addAttribute()를 활용하여 객체를 저장할 경우 세션에 저장이 되도록 지정
  • @ModelAttribute : 세션에 객체를 저장되도록 지정

 

5.1 로그인 

@SessionAttributes("member") 
@Controller
public class MemberController {
	@Autowired
	private MemberService memberService;
	
	@PostMapping("login")
	public String loginProcess(Model model, Member member) {
		Member isMember = memberService.getMember(member); 
		if (isMember != null) {
			model.addAttribute("member", isMember); 
			return "redirect:index.html";
		} else {
			return "redirect:login";
		}
	}
}

 

5.2 로그인 세션 확인

@GetMapping("/")
public String main(@ModelAttribute("member") Member member) {
	if(member.getId() == null) { 
		return "redirect:login";
	} else {
		return "redirect:index.html"
	}
}

 

5.3 로그아웃

@GetMapping("logout")
public String logoutProcess(SessionStatus status) {
	status.setComplete();
	return "redirect:index.html";
}