로그인V1-쿠키,세션

Shaun·2022년 10월 9일

스프링

목록 보기
5/6
post-thumbnail

로그인

패키지 구조

  • 도메인과 웹으로 구분해준다.

  • 도메인 : 화면, UI, 기술 인프라 등등의 영역은 제외한 시스템이 구현해야 하는 핵심 비즈니스 업무 영역을 말함

  • 웹 : 화면 , UI ..

회원가입 구현

repo

  • 타임리프 폼은 어렵지 않아 설명은 생략한다.

  • 단순 map에 key, value 형태로 id,member객체 를 저장하는 방식이다. 그리 어렵지 않다.

로그인 (순수코드)

  • 쿠키, 세션 을 사용하지 않고 순수 코드로만 로그인 기능을 만들어 보자.

  • 로그인 뷰단은 타임리프 onclik을 활용해 로그인클릭시 /loging API로 연결 시켜준다.

  • 로그인시 일단 입력한 ID에 해당하는 ID가 있나 확인을 하고 비밀번호를 확인한다.

  • 입력폼에 오류가 있을경우를 bindingResult로 체크 -> 오류있으면 다시 로그인 화면으로

  • 입력한 값으로 DB에서 해당 계정이 있으면 반환 없으면 오류 메세지 반환후 다시 로그인 페이지로

  • reject 를 활용해 글로벌 에러를 보내준다.

  • @ModelAttribute("aaa") = 뷰단에 aaa라는 이름을 가진 객체로 폼이 넘어간다 .

=> 순수 코드로만 로그인 기능을 구현해봤다. 하지만 여기서 문제점은 로그인 상태가 다음페이지로 넘어가면 유지가 되지 않는다는점! 쿠키와 세션을 활용해 로그인 유지를 구현해보자

로그인-쿠키

  • 간단히 설명하면 로그인 성공뒤 서버에서 이사람은 로그인 완료된 사용자 다라는 데이터(쿠키)를 보내 쿠키저장소 라는 곳에 저장하는것

  • 다른 사이트로 넘어갈때마다 쿠키에서 로그인 완료했다는 데이터를 사용한다.

  • 기존 컨트룰러에서 추가된 부분이다.

  • 로그인에 성공하면 쿠키라는 공간에 memberId라는 이름으로 실제 로그인한 멤버의 ID값을 넣어 response에 쿠키를 한번더 담아서 클라로 던져준다.

  • 클라이언트가 다음 사이트로 접속요청을 보낼때 쿠키데이터(memberId) 를 사용해 인증을 한다.

로그인 후 화면

  • 로그인후 클라이언트가 보낸 쿠키값을 서버에서 꺼내는 방법이다. @CookieValue 로 데이터를 담은 쿠키 이름(?) 을 설정 값을 꺼내준다.

  • required = false -> home화면은 로그인을 하지 않은 사람도 접속할수 있으니까

로그아웃- 쿠키

  • 쿠키 시간을 설정하는 sexMaxAge(0) 으로 맞춰준뒤 response 에 그 쿠키를 담아 보내준다.

쿠키단점

  • 하지만 쿠키는 치명적인 단점이 있는데... 쿠키값을 조작하기 너무 쉽다는 점이다.

  • 이를 해결하기 위해 나온게 세션 이다.

세션

  • 세션과 쿠키에 대해 자세한 설명은 이전에 포스팅 한적이 있다
    -> 세션/쿠키
  • 세션을 사용하지만 쿠키를 통해 전달하므로 결국 쿠키로 연결됀다.

세션동작방식

  1. 클라가 로그인을 하면 해당 정보가 있는지 서버에서 찾는다. 있으면 해당 로그인 객체를 value로 저장하고 키값은 랜덤(세션Id)으로 생성한다.
  2. 그 키값을 쿠키에 담아 클라에게 보낸다.
  3. 클라는 그 쿠키안에 있는 키값으로 인증을 한다.

장점

  • 세션 ID값만 보냄으로 여기에는 중요한 정보가 없다.
  • 쿠키값을 변조 불가능하게 만든다(랜덤값)
  • 토큰이 해킹당해도 서버에서 컨트룰 가능

세션-순수코드

  • 세션을 사용하지 않고 순수코드로만 세션을 만들어보자

SessionCreate

  • UUID를 활용해 랜덤값 (세션ID) 값을 만들어 준뒤 map 에 키값으로, value는 로그인한 객체를 저장 해준다.

  • 쿠키 -> response 순으로 담아서 클라에게 보내준다.

  • Map은 쓰레드 동시성에 대해 안전하지 않다. CocurrentHashMap를 사용해 안전성 확보

SessionRead

  • 세션조회 -> 쿠키이름으로 쿠키를 조회 -> 해당 쿠키가 있으면 해당 쿠키안에서 세션 ID 추출뒤 value값 조회

SessionDelete(로그아웃)

  • 쿠키에서 꺼내 값을 지워주면 됀다.

SessionTest

  • 어렵지는 않다 다만 눈여겨 봐야할점은 가짜 response 를 생성해주는 MokcHttpSerlvletResponse 와 가짜 request를 생성해주는 MockHttpServletRequest

Controller

  • 로그인 성공하면
    ->세션 ID(랜덤값) 생성뒤 로그인 객체와 함께 key-value로 저장
    ->세션 Id를 쿠키에 쿠키의 이름과 담고 response에 한번 더담아 클라에게 보낸다.

HomeController

  • 로그인 성공시 세션값을 꺼내는 프로세스다. getSession 으로 해당 쿠키를 찾은뒤 쿠키에서 세션ID를 꺼낸다.

서블릿 HTTP세션

  • 직접만든 세션이 아닌 공식지원하는 서블릿 HTTP세션을 사용해보자.

  • HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.

  • request.getSession = 세션이 있으면 그것을 반환하고 없으면 새로 생성한다.

  • session.setAttribute = 세션에 객체(로그인 맴버) 값 저장

  • 쿠키에서 꺼내고 만료시키고 할필요없고 Request로 세션을 가져와 그냥 invalidate만 시켜주면 됀다.

  • Home에서는 request.getSession 으로 세션값이 있는지 체크한후 값이 있으면 세션에 객체를 저장할때 사용했던 이름으로 session.getAttribute 를 해서 value값을 가져온다.

@SessionAttribute

  • 로그인된 사용자를 찾을때 사용한다. 기존 코드들을 더 편리하게 사용하기 위함

  • 이 애노테이션은 세션을 생성하지 않는다.

  • 세션을 찾고, 세션에 들어있는 데이터를 찾는 번거로운 과정을 스프링이 한번에 편리하게 처리해주는 것을 확인할 수 있다.

세션타임아웃 설정

  • 보통 로그아웃을 누르지 않고 그냥 브라우저 창을 닫는 경우가 대부분이다. (세션유지)

  • HTTP가 비 연결성(ConnectionLess)이므로 서버 입장에서는 해당 사용자가 웹 브라우저를 종료한 것인지 아닌지를 알 수 없다.

  • 세션은 메모리를 사용한다. 수가 많아지면 그만큼 서버에 부담을 준다.
    ->세션은 꼭 필요 할떄만 생성한다.

  • 세션의 타임아웃 시간은 해당 세션과 관련된 JSESSIONID 를 전달하는 HTTP 요청이 있으면 현재 시간으로 다시 초기화 된다

  • properties 에 세션 유지시간 설정
    ->server.servlet.session.timeout=60

=> 이 문제점을 해결하기 위해 세션 생명주기를 조정해준다.
=> 보통 최근요청 30분 이후로 설정

profile
호주쉐프에서 개발자까지..

0개의 댓글