로그인1(쿠키,세션)

KJH·2023년 1월 29일

SpringMVC2

목록 보기
7/12

쿠키를 사용한 로그인

로그인 상태 유지하기
로그인에 성공하면, 쿠키를 생성하고 HttpServletResponse에 담는다.
웹 브라우저는, 세션이 끊기기 전까지 쿠키를 서버에 계속 보내줌

로그아웃시에는, 똑같은 이름의 새 쿠키를 생성하고,.setMaxAge(0)으로 지속시간을 없애고, HttpServletResponse 에 담아주면 된다.

보안문제

쿠키값은 임의로 바뀔 수도 있고, 웹 브라우저에 보관되기 때문에 누군가 정보를 훔처갈 수도 있음
해커가 한번 쿠키를 가져가면 평생 사용 가능

대안

  • 토큰을 사용, 서버에서 매핑해서 인식, 서버에서 토큰 관리(만료시간짧게)

세션 동작 방식

쿠키는 여러 보안 이슈가 있다.
이 문제를 해결하기 위해, 중요한 정보는 서버에 저장하고, 클라이언트와 서버를 임의의 식별자 값으로 연결해야 한다.

로그인

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

세선 생성

응답 쿠키

결국 쿠키를 사용하지만, 클라이언트는 세션ID만 가지고 있을 뿐 중요한 정보는 서버에 있다

클라이언트의 쿠키 전달


세션 직접 만들기

  • 생성
    • sessionID(UUID사용) 생성
    • 세션 저장소에 sessionId와 값 저장
    • sessionId가 담긴 쿠키를 클라이언트에 전달
  • 조회
    • 클라이언트가 요청한 sessionId(쿠키) 값으로, 세션 저장소 조회
  • 만료
    • 클라이언트가 요청한 sessionId 값으로 세션 저장소에서 제거

세션은 특별한게 아니고 단지 쿠키를 사용해서 서버에서 데이터를 유지하는 방법일 뿐이다


서블릿 Http 세션

서블릿의 HttpSession 기능을 사용

세션 생성 & 조회
request.getSession(true) default

  • 세션이 있으면 기존 세션 반환, 없으면 생성
  • false를 주면, 없으면 null반환

정보보관 & 삭제

  • 보관
    session.setAttribute(String name, Object value);로 값 넣기
  • 삭제
public String logoutV3(HttpServletRequest request) {
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "redirect:/";
    }
    //request.getSession(false)로 세션이 있는지 확인
    //만일 세션이 있으면 invalidate()를 통해 제거

@SessionAttribute를 통해 세션에서 간단하게 꺼낼 수 있음

@GetMapping(.....)
 public String homeLoginV3Spring(
            @SessionAttribute(name = "loginMember",
            required = false) Member loginMember, Model model)

세션 정보와 타임아웃

세션 기본 정보

  • sessionId : 세션아이디
  • maxInactiveInterval 유효시간
  • creationTime : 생성일시
  • lastAccessedTime : (사용자가) 최근 서버에 접근한 시간
  • isNew 새로 생성됬는지

타임아웃 설정
현재 사용자가 로그아웃을 하지 않으면, 서버는 세션 데이터를 계속 보관해야함
따라서, 사용자가 최근에 요청한 시간을 기준으로 생존시간을 유지해줌

  • 글로벌 설정
    application.properties에 설정
    server.servlet.session.timeout=60 (60초)
  • 특정 세션 단위로 설정
    session.setMaxInactiveInterval(60);

lastAcessTime 이후로 timeout 시간이 지나면, Was가 세션을 제거해줌

세션은 기본적으로 메모미를 사용하므로, 최소한의 정보만 보관하자

0개의 댓글