SpringBoot - ToyProject / Temporage / 로그인 Session 처리 방법

2020. 2. 7. 01:03학부 프로젝트/Temporage

Session을 처리하는건 생각보다 귀찮은 문제였다.

 

 

  • Session에 대한 전제
    • Session ID 는 브라우저가 바뀌면 바뀌게 된다.
    • 어떤 방법을 써도 Session ID가 바뀌었을때 이전 사용자와 다르다고 판단하여 로그아웃 처리를 하게 된다.
    • 브라우저를 껏다가 같은 브라우저를 켜도 Session ID는 바뀌게 된다.
  • 세션을 처리하는 방법
  1. DB에 Session을 저장
  2. 서버의 in-memory에서 관리
  3. Client에서 직접 관리 (말이 안되는 방식)
  4. server에서 file을 만들어 관리.

 

여기서 나는 DB에 Session ID를 저장해서 관리하는 방법을 사용할 예정이다.

 

순서

  1. 새로운 table을 생성.
  2. 최초 로그인 할 때 session_id, email, access_date 를 저장.
  3. 세션을 확인하기 위해 Client -> Server로 페이지가 넘어갈 때 마다 request를 보냄.
  4. email로 session ID를 검색해 session ID 가 틀리면 logout 절차를 밟음. 
  5. session ID가 같다면 access_date를 갱신
  6. 특정 시간 만큼 access_date가 갱신되지 않았다면 row 삭제. 

 

1. 새로운 Table 생성

새로운 Entity 생성. Session을 따로 저장하는 Table

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create-drop

이때 DB에 직접적으로 table을 생성하지 않아도, ddl-auto 옵션을 create-drop으로 주면 APP을 실행해서 WAS가 올라갈때마다 DB가 초기화되고 테이블이 자동으로 다시 생성된다. 원하지 않으면 validate 로 옵션을 변경하면 된다.

 

2. 최초 로그인시 Session 저장

 

로그인 Request가 오면 session을 만들어서 DB에 저장 후 session ID 를 return 함

 

3. Session 확인

 

사실 이게 맞게 하는건지는 모르겠다. COOKIE를 사용해 JSESSION 값을 받아와 자동으로 체크하게 만들어 주어야 하는데 일단은 DB에서 불러와서 Client에서 직접 parameter로 넘어온 값을 비교했다.

 

잘못된 방법. @RequestParam으로 직접 Client에서 Post요청으로 넘어온 session_id 라는 값과 Server session 값을 비교해서 session을 체크했다. HTTP에는 JSESSIONID라는 COOKIE 값이 있는데 여기에 Server로 부터 받은 session 값이 저장된다.

 

위 그림과 바뀐 점이라고는, c_sessionId 매개변수의 annotation이 @RequestParam 에서 @CookieValue 로 바뀌었다. @CookieValue는 HTTP Request의 COOKIE 안에 있는 key값을 불러온다. ( cookie는 key : value 매핑이다.)

 

2편 작성 예정