나의 길

쿠키와 세션 및 spring security 알아보기 본문

Framework/Spring boot

쿠키와 세션 및 spring security 알아보기

MoonjuLee 2024. 3. 31. 23:55

사이드 프로젝트 진행 중 로그인 구현을 위해 공부한 쿠키 및 세션, 로그인 과정에 대한 정리입니다!

 

쿠키, 세션을 알아보는 이유 👀

 

 HTTP(이전 게시물을 보고 오시면 이해가 조금 편할 것 같습니다!)를 통해 통신할 때 특징 중 무상태(stateless)와 비연결성(connectionless)을 생각해 보면 클라이언트가 서버에 요청을 보내고 이후 연결을 끊고, 이전 상태를 기억하지 못합니다.

 

 하지만 서비스를 운영하면서 클라이언트의 상태 정보를 기억하고, 연결을 유지해야 될 필요가 있습니다.

예를 들면 로그인 검증을 페이지 이동을 할 때마다 실행한다거나, 일주일 간 이 창을 보지 않기 기능입니다.

(로그인 검증을 계속하게 되면 서비스 속도에 영향을 줍니다!)

 

 이런 필요성 때문에 쿠키와 세션을 사용합니다!

 

쿠키(cookies)

 

 쿠키란 웹 브라우저에 저장되는 작은 데이터 조각이고, 로컬 컴퓨터에 저장된다.

 

 백문이불여일견 한 번 봐보자!

 

생성된 쿠키

 

 name-value로 이루어져 있고, 만료 날짜(Expires / Max-Age), Domain 등의 속성이 있습니다.

 

 동작 순서는 클라이언트가 요청을 보내면 웹 서버에서 위에 나열된 속성을 설정하여 쿠키를 생성하고 응답을 할 때 클라이언트에게 같이 보냅니다. 이후 클라이언트가 넘겨받은 쿠키를 서버에 요청을 할 때마다 전송한다.

 

세션(session)

 

 세션이란 클라이언트와 서버 간의 상태를 유지하는 개념입니다. 세션은 서버에서 클라이언트의 고유 세션을 생성하고 세션 ID를 클라이언트에 부여합니다. 서버는 이 세션 ID를 통해 클라이언트를 식별하고 상태를 유지합니다.

 

 백문이불여일견 한 번 봐보자!

 

생성된 세션

 

 세션은 쿠키 형태로 저장되고, 브라우저를 끄거나, 세션이 삭제될 경우 없어진다.

 

 세션의 동작 순서는 클라이언트가 요청을 보낼 때 header에 session-id를 보내고 없다면 서버는 세션을 생성하여 클라이언트에 보낸다. 여기서 톰캣의 세션 ID는 JSESSIONID이다. 클라이언트는 다음 요청에도 세션 쿠키를 서버에 전달합니다.

 

spring security

 

프로젝트 생성

 

 간단하게 두 가지의 의존성만 추가하여 프로젝트를 생성해 줍니다. 그리고 간단한 컨트롤러를 아래의 이미지와 같이 만들어 줍니다.

 

 

 

 그리고 다 만들었다면 해당 URL을 통해 접근해 줍니다.

 

 

 spring security를 적용하지 않았을 때는 Hello World!라는 문구가 페이지에 표시됐는데, 우리가 만들지도 않은 로그인 페이지가 나타났습니다😅(URL도 /login으로)

 

 로그인을 하기 위해 username은 default 값으로 user, password는 애플리케이션 시작 후 찍히는 로그에서 확인을 할 수 있습니다.

 

 

 

 로그인을 거친 후 세션 쿠키가 발급되고 정상적으로 페이지가 보입니다. 여기서 한 가지 알아둘 것은 모든 요청에 대해서 로그인 폼이 보인다는 것입니다. 예를 들어 없는 URL로 요청을 보내도 로그인 페이지가 표시됩니다. 그 후 로그인을 거쳐야 없는 페이지라는 것을 알 수 있습니다.

 

로그인 시 발급된 세션 쿠키

 

 Spring MVC는 Request 👉 Dispatchar Servlet 👉 Controller이고, Spring Security를 적용하면 Request 👉  Spring Security filter chain 👉 Dispatchar Servlet 👉 Controller 순으로 요청이 응답됩니다.

 

 로그아웃은 /logout에 접속해서 해주시면 됩니다.

 

 위에서 설명한 폼인증 이외에 기본 인증 방식인 헤더에 base64 인코딩을 한 내용을 보내 인증하는 방식도 있다. 하지만 단점들(base64의 디코딩이 쉽다. 등) 때문에 거의 사용하지 않습니다. 

 

 더 심화 내용은 다음 포스팅에 올리겠습니다 👊

Comments