Study/Spring

[Spring] 로그인 처리하기 - 쿠키, 세션

욘아리 2024. 6. 4. 16:04

오늘은 로그인 기능에 대해 간단하게 정리해보려고 한다.

 

로그인 기능

🔸 우선 로그인 ID, 비밀번호를 입력하는 과정부터 생각해 보자.

 

로그인의 핵심 비즈니스 로직은 회원을 조회한 다음에 파라미터로 넘어온 password와 비교해서 같으면 회원을 반환하고, 만약 password가 다르면 null을 반환한다.

 

로그인 컨트롤러는 로그인 서비스를 호출해서 로그인에 성공하면 홈 화면으로 이동하고, 로그인에 실패하면 오류를 생성한다. 그리고 정보를 다시 입력하도록 로그인 폼을 뷰 템플릿으로 사용한다.

 

로그인의 상태를 유지하면서, 로그인에 성공한 사용자는 홈 화면에 접근 시 고객의 이름을 보여주려면 어떻게 해야 할까?🤔

 

로그인 처리 - 쿠키

🔸 로그인의 상태를 유지하기 위해 쿠키를 사용해 보자.

 

서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달하고, 브라우저는 앞으로 해당 쿠키를 지속해서 보내주면 된다.

 

로그인 - 쿠키 생성

 

로그인 후 홈페이지 접근 - 클라이언트 쿠키 전달

 

🍪 쿠키 종류
영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료 시 까지만 유지

 

✔️ 브라우저 종료시 로그아웃 되길 기대하므로, 우리에게 필요한 것은 세션 쿠키

 

👀 그런데 잠깐, 여기에는 심각한 보안 문제가 있다.

 

쿠키와 보안 문제

  • 쿠키 값은 임의로 변경 가능하다.
    • 클라이언트가 쿠키를 강제로 변경할 경우 다른 사용자가 된다.
    • 실제 웹브라우저 개발자모드 -> Application -> Cookie 변경으로 확인된다.
  • 쿠키에 보관된 정보는 훔쳐갈 수 있다.
    • 만약 쿠키에 개인정보나, 신용카드 정보가 있다면?
    • 이 정보가 웹 브라우저에도 보관되고, 네트워크 요청마다 계속 클라이언트에서 서버로 전달된다.
    • 쿠키의 정보가 나의 로컬 PC에서 털릴 수도 있고, 네트워크 전송 구간에서 털릴 수도 있다.
  • 해커가 쿠키를 한 번 훔쳐가면 평생 사용할 수 있다.

 

👉 대안

🔸 쿠키에 중요한 값을 노출하지 않고, 사용자 별로 예측 불가능한 임의의 토큰(랜덤 값)을 노출하고, 서버에서 토큰과 사용자 id를 매핑해서 인식한다. 그리고 서버에서 토큰을 관리한다.
🔸 토큰은 해커가 임의의 값을 넣어도 찾을 수 없도록 예상 불가능 해야 한다.
🔸 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 해당 토큰의 만료시간을 짧게 유지한다. 또는 해킹이 의심되는 경우 서버에서 해당 토큰을 강제로 제거하면 된다.

 

앞서 쿠키에 중요한 정보를 보관하는 것은 보안 문제가 있기 때문에 이 문제를 해결하려면 중요한 정보는 모두 서버에 저장해야 한다. 그리고 클라이언트와 서버는 추정 불가능한 임의의 식별자 값으로 연결해야 한다. 그렇기 때문에 세션을 이용해 보도록 하자.

 

로그인 처리 - 세션

🔸 서버에 중요한 정보를 보관하고 연결을 유지하는 방법을 세션이라 한다. 그렇다면 세션 동작 방식에 대해 알아보자.

 

세션 동작 방식

 

로그인

  • 사용자가 loginId, password 정보를 전달하면 서버에서 해당 사용자가 맞는지 확인한다.

 

세션 생성

  • 세션 ID를 생성하는데, 추적 불가능해야 한다.
    • UUID를 사용하여 추정을 불가능하게 한다.
  • 생성된 세션 ID와 세션에 보관할 값(memberA)을 서버의 세션 저장소에 보관한다.

 

세션 ID를 응답 쿠키로 전달

  • 클라이언트와 서버는 결국 쿠키로 연결이 되어야 한다.
    • 서버는 클라이언트에 세션 ID만 쿠키에 담아서 전달한다.
    • 클라이언트는 쿠키 저장소에 세션 ID 쿠키를 보관한다.
  • 여기서 회원과 관련된 정보는 전혀 클라이언트에 전달하지 않고, 추적 불가능한 세션 ID만 쿠키를 통해 클라이언트에 전달하고 있다.

 

로그인 이후 접근 - 클라이언트의 세션 ID 쿠키 전달

  • 클라이언트는 요청 시 항상 세션 ID 쿠키를 전달한다.
  • 서버에서는 클라이언트가 전달한 쿠키 정보로 세션 저장소를 조회해서 로그인 시 보관한 세션 정보를 사용한다.

 

👉 세션을 사용해서 서버에서 중요한 정보를 관리하게 되었다. 덕분에 앞서 말했던 보안 문제들을 해결할 수 있다.

  • 쿠키 값 변조 가능 ▶️ 예상 불가능한 복잡한 세션 ID를 사용
  • 쿠키에 보관하는 정보는 클라이언트 해킹 시 털릴 가능성 높음 ▶️ 세션 ID가 털려도 여기에는 중요한 정보가 없음
  • 쿠키 탈취 후 사용 ▶️ 해커가 토큰을 털어가도 시간이 지나면 사용할 수 없도록 서버에서 세션의 만료시간을 짧게 설정한다.

 

✨👩‍💻✨

로그인 기능은 프로젝트에 적용할 땐 훨씬 더 복잡하고, 실제로 많은 어려움을 겪으며 구현했던 기능이었다.

비록 간단한 내용이었지만 이번 정리를 통해 세션과 쿠키의 개념을 명확하게 이해할 수 있어서 좋았다.

 

 

 

출처

스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 | 김영한 - 인프런

'Study > Spring' 카테고리의 다른 글

[Spring] 서블릿 예외 처리  (0) 2024.09.05
[JPA] N+1 문제 원인 및 해결  (0) 2024.09.03
[Spring] MVC 패턴  (0) 2024.05.03
[Spring] 서블릿(Servlet)  (0) 2024.04.19
[Spring] 스프링 빈 생명주기  (0) 2024.04.13