세션을 이용해서 로그인 구축하려면 제대로 알자...
일단 쿠키와 세션부터 제대로 정리하고 시작하자...
쿠키란?
세션이란?
그러면 스프링 부트에서는 어떻게 세션이 저장되고 동작하는가?
레디스와 세션 ID
이 부분은 스프링부트 레디스-세션을 연결했을 때임!
서버 최초 접속 시 서버는 세션 ID를 응답헤더의 쿠키에 담아 클라이언트한테 보낸다.
Set-Cookie : SESSOIN=MmVkNzBmMTgtNjgwZi00ODk5LTk0MmItYThkYjU5YWNmZmQy

SESSOIN=MmVkNzBmMTgtNjgwZi00ODk5LTk0MmItYThkYjU5YWNmZmQy 이것이 세션ID이다.
여기서 중요한 것은
로그인을 하던 뭐를 하던 일단 서버에 접속하면 서버는 접속한 클라이언트에게 세션ID를 발급한다는 것이다.
진짜인가? 레디스에서 한번 확인해보면(위에는 로그인한 상태가 아니고 그냥 스웨거에 접속한 상태)

뭐가 있긴하다!!
"spring:session:sessions:2ed70f18-680f-4899-942b-a8db59acffd2"
잉 근데?? 뭘까?? 분명 많은 블로그들과 자료들을 찾아보면
2ed70f18-680f-4899-942b-a8db59acffd2 부분이 세션ID라고 하는데 이상하지 않은가???
서버에서 세션 ID를 발급할 때 분명 세션ID MmVkNzBmMTgtNjgwZi00ODk5LTk0MmItYThkYjU5YWNmZmQy 였는데 말이다.
여기서 그 어떤 블로그도 설명이 없던 부분이다.
바로 서버에서 세션ID 발급시 Base64 인코딩을 한 후 응답 헤더의 쿠키에 담아서 보낸다는 것이다!
진짜일까?? 해보면 되는거다!

짜잔 MmVkNzBmMTgtNjgwZi00ODk5LTk0MmItYThkYjU5YWNmZmQy 디코딩 하니 2ed70f18-680f-4899-942b-a8db59acffd2 값이 나오게 되었다.
세션ID를 너무 쉽게 탈취 당할 수 있는거 아닌가?
그런데 세션 ID만 가지고는 할 수 있는게 없다.
jwt와 같이 안에 유저에 대한 정보를 담아 놓는게 아니기 때문이다.
그 다음 절차는 어떻게 되는거지??
세션ID는 키이고 그 값에 해당하는게 레디스에 저장되는 것이다.
로그인을 예를 들어 본다면
@Transactional(readOnly = true)
public String login(LoginDTO loginDTO, HttpSession session) {
User user = userRepository.findByEmail(loginDTO.getEmail());
if(user == null || !user.isPasswordMatch(passwordEncoder, loginDTO.getPassword()))
throw new UserException(UserErrorCode.FAIL_TO_LOGIN);
session.setAttribute("user",user);
return "로그인 완료";
}
이게 뭐냐면
1. 클라이언트에 받은 이메일로 유저 있는지 확인절차
2. 유저 있으면 세션ID에 해당하는 세션에 키 : "user" , 값 : 클라인트가 로그인한 유저
이렇게 해줘 라는 코드이다.
진짜인가? 진짜다! 레디스에서 확인해보자!

로그인 전과 로그인 후의 차이
"sessionAttr:user" 추가 된것을 볼 수 있다!

hget으로 더 자세하게 살펴본다면 로그인한 유저의 정보를 이렇게 볼 수 있는 것이다.
오늘 가장 헤맸던 점은 세션ID가 왜 다르지??였다. 분명 서버에서 세션 ID를 발급하는데,,, 레디스에 있는 세션ID와 왜 다른거지?? 이거 때문에 계속 찾아봤는데 마땅히 설명해주는 부분이 없었다. 그래서 혹시나 서버에서 세션ID 발급시 암호화를 해주나 싶어서 찾아보니 Base64로 암호화해서 클라이언트에게 전송한다는 것... 나만 몰랐나! 배웠으면 됐다! 오늘도 한걸음 성장한거다!