스프링 로그인 처리

Updated:     Updated:

Categories:

Tags: , , , ,

쿠키를 직접 만들어 로그인 상태 유지하기

클라이언트에서 온 요청을 바탕으로 직접 쿠키를 생성해 로그인 상태를 유지하는 방법을 구현하는 로직 다음과 같다.

1) 클라이언트 요청으로부터 아이디와 비밀번호 받기 2) 서비스 처리 로직에 로그인 검증 맡기기 3) 로그인에 실패 했다면 다시 로그인 폼으로 이동 4) 로그인에 성공 했다면 쿠키를 생성 후 응답에 쿠키 추가

Cookie idCookie = new Cookie("memberId", String.valueOf(loginMember.getId()));
response.addCookie(idCookie);

쿠키 객체를 만들고 응답에 넣기

@CookieValue 애노테이션을 통해 쿠키를 가져올 수 있다.

@CookieValue(name = "memberId", required = false) Long memberId

하지만 위와 같은 방식은 쿠키의 값에 사용자에 관한 정보가 있기 때문에, 보안에 취약하다. 임의의 값을 노출시키고 서버에서는 이 값을 통해 사용자를 매핑해서 인식하게 해야한다. 이때 매핑에 관한 정보를 저장하는 곳을 세션이라고 한다.


세션을 만들어 로그인 처리하기

세션에서는 다음 세가지 기능을 처리할 수 있어야 한다.

1) 세션 생성

  • 임의의 값 sessionId 생성하기
  • sessionId에 해당되는 정보를 보관하는 세션 저장소 만들기
  • sessionId로 응답 쿠키 만들어서 전달하기

2) 세션 조회

  • 클라이언트가 요청시 같이 보내준 쿠키를 통해 세션 저장소를 통해 쿠키값 확인하기

3) 세션 만료

  • 세션 저장소에 보관한 sessionId값 제거하기

세션 생성 하기

public void createSession(Object value, HttpServletResponse response) {
String sessionId = UUID.randomUUID().toString(); 
sessionStore.put(sessionId, value);
Cookie mySessionCookie = new Cookie(SESSION_COOKIE_NAME, sessionId); 
response.addCookie(mySessionCookie);
}

1) UUID를 통해 임의의 값을 생성하고 sessionStore에 키와 값을 저장한다. 2) 쿠키를 만들고 응답객체에 넣어준다.

세션 조회하기

public Object getSession(HttpServletRequest request) {
        Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
        if (sessionCookie == null) {
            return null;
        }
        return sessionStore.get(sessionCookie.getValue());
    }

1) 요청의 쿠키값들을 돌아가 검증하며 찾고자 하는 쿠키가 있는지 확인한다. 2) 쿠키값이 있다면 세션 저장소에서 값 꺼내서 전달한다.

세션 만료

public void expire(HttpServletRequest request) {
        Cookie sessionCookie = findCookie(request, SESSION_COOKIE_NAME);
        if (sessionCookie != null) {
            sessionStore.remove(sessionCookie.getValue());
        }
}

1) 세션 저장소에서 쿠키를 찾아서 쿠키가 있다면 세션 저장소에서 제거한다.

세션은 서버에서 데이터를 유지하기 위한 하나의 저장소이다. 서블릿에서는 세션개념을 지원하기 때문에, 서블릿 세션저장소를 이용하면 편리하게 사용할 수 있다.


서블릿 HTTP 세션

HTTP 서블릿 요청 객체에 getSession()함수를 통해 session을 구할 수 있다.

HttpSession 인터페이스에 대한 설명을 읽어보면 유저에 대한 정보를 저장할 수 있도록 해주고, 세션 시간, 연결 개수등을 관리할 수 있다.

세션 생성 request.getSession(create = true)

create = true : 세션이 있다면 세션 반환하고, 없다면 새로 생성 후 반환 create = false : 세션이 있다면 세션 반환하고, 없다면 null 반환

세션 값 저장

session.setAttribute("키값", "객체");

세션 무효

session.invalidate()

spring 카테고리 내 다른 글 보러가기

Leave a comment