Spring MVC - 로그인 처리(쿠키 & 세션)

YUNU·2023년 11월 7일
0

스프링

목록 보기
32/33
post-thumbnail

🪴 Spring MVC


🌱 로그인 처리

🟦 로그인 상태 유지

쿼리 파라미터를 계속 유지하며 로그인 상태를 유지하는 것은 어렵고 번거로움

➡️ 쿠키를 사용하여 로그인 상태를 유지

서버에서 로그인에 성공하면 HTTP 응답에 쿠키를 담아서 브라우저에 전달
-> 브라우저는 앞으로 해당 쿠키를 지속해서 보냄

브라우저 종료 시에는 로그아웃이 되어야 하므로 세션 쿠키 사용
(쿠키에 만료 날짜를 생략하면 세션 쿠키)

  • 영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
  • 세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료 시까지만 유지
@PostMapping("/login")
public String login(//... , HttpServletResponse response) {

	// 쿠키 생성
	Cookie 쿠키변수 = new Cookie(string name,string value);
	// 생성한 쿠키를 response에 담아 전달
	response.addCookie(쿠키변수);
    //...
    
    //ex)
    //Cookie idCookie = new Cookie("userId", String.valueOf(User.getId()));
    //response.addCookie(idCookie);
    //return "redirect:/";
}

@PostMapping("/logout")
public String logout(HttpServletResponse response) {
    expireCookie(response,"userId");
    return "redirect:/";
}
private void expireCookie(HttpServletResponse response, String cookieName) {
    // 응답 쿠키 생성
    Cookie cookie = new Cookie(cookieName, null);
    // 즉시 종료
    cookie.setMaxAge(0);
    response.addCookie(cookie);
}

❗그러나 쿠키만 가지고 위의 방식처럼 개발하면 보안에 심각한 문제 발생


🟦 쿠키의 보안 문제

🔷 쿠키의 보안 문제

  1. 쿠키 값은 임의로 변경이 가능함
    클라이언트가 쿠키를 강제로 변경한다면 다른 사용자가 됨

  2. 쿠키에 보관된 정보는 보안에 취약
    쿠키에 보관된 정보는 훔쳐갈 수 있음

    쿠키는 웹 브라우저에도 보관되고, 네트워크 요청마다 클라이언트에서 서버로 전달됨
    -> 탈취 가능한 경로가 많음

    만약 쿠키에 중요한 정보를 저장하고 있다면 문제가 발생할 것

  3. 탈취한 쿠키로 악의적인 요청을 계속 시도할 수 있음
    해커가 쿠키를 훔쳐간다면 그 쿠키를 평생 사용할 수 있음

🔷 쿠키의 보안 문제 해결 방안

  1. 토큰 사용
    쿠키에 중요한 값 노출 X, 사용자 별로 예측 불가능한 임의의 토큰을 노출

    -> 서버에서는 토큰과 사용자 id를 매핑해서 인식, 토큰은 서버에서 관리
    (토큰은 해커가 임의의 값을 넣어도 찾을 수 없도록 예상 불가능해야 함)

  2. 토큰을 탈취당하더라도 시간이 지나면 사용할 수 없도록 설정
    토큰의 만료 시간을 짧게 유지
    혹은 해킹 의심되는 경우엔 서버에서 토큰 강제 삭제


🟦 세션

: 서버에 중요한 정보를 보관하고 연결을 유지하는 방법

쿠키에 중요한 정보를 보관하는 것은 여러가지 보안 이슈가 존재

쿠키의 보안 문제를 해결하기 위해선 중요한 정보를 서버에 저장해야 함

➕ 클라이언트와 서버는 추정 불가능한 임의의 식별자 값으로 연결해야 함

🔷 세션 동작 순서 예시

  1. Id, Password 입력하여 로그인 요청

  2. Id와 Password가 일치 여부 확인

  3. 추정 불가능한 세션 ID(토큰)를 생성하여 key값으로 사용, value로 회원 객체 저장
    (세션 저장소)

    세션 ID 생성하는데 JAVA 제공 UUID 사용
    String sessionId = UUID.randomUUID().toString();
    
    UUID는 추정이 불가능
    Cookie: mySessionId=zz0101xx-bab9-4b92-9b32-dadb280f4b61
  4. 세션 ID를 응답 쿠키로 전달

  5. 클라이언트는 쿠키 저장소에 세션 ID 저장
    회원과 관련된 정보는 클라이언트에 전달 ❌, 추정 불가능한 세션 ID 값만 전달

  6. 로그인 이후 클라이언트는 요청마다 항상 서버로 세션 ID 쿠키를 전달
    서버는 전달받은 세션 ID값을 가지고 세션 저장소를 조회


🔷 세션을 사용하여 중요한 정보를 서버에 관리 -> 보안 이슈 해결

예상 불가능한 세션 ID를 사용
➡️ 쿠키 값 변조하더라도 세션 ID를 찾을 수 없을 것

세션의 만료 시간을 짧게 유지 ( or 해킹 의심이 되는 경우 해션 강제 삭제)
(ex: 세션 저장소에 일정 시간 사용하지 않은 세션 삭제)
➡️ 쿠키를 해킹당해 탈취당하더라도 세션 ID만 탈취 당할 것, 세션 ID에는 중요한 정보가 없음
➡️ 해커가 탈취한 토큰(세션 ID)을 사용하려 한다해도 세션 저장소에 해당 세션 ID가 없기에 문제 없음


🔷 세션 관리

세션 관리는 크게 세션 생성, 세션 조회, 세션 만료 기능을 제공

  • 세션 생성
    • sessionId 생성(임의의 추정 불가능한 랜덤 값)
    • 세션 저장소에 sessionId와 value 저장
    • sessionId로 응답 쿠키 생성, 생성한 쿠키를 클라이언트에 전달
  • 세션 조회
    • 세션 저장소에 보관한 값 조회
      (클라이언트가 요청한 sessionId 쿠키의 값으로)
  • 세션 만료
    • 세션 저장소에 보관한 sessionId와 value 제거
      (클라이언트가 요청한 sessionId 쿠키의 값으로)

❗ 세션 : 쿠키를 사용하되 서버에서 최대한 데이터를 유지하는 방법


🔷 HttpSession


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

profile
DDeo99

0개의 댓글