본문 바로가기
network

[network 1편] 로그인 관련 정리 (세션, JWT)

by 무대포 개발자 2022. 7. 16.
728x90
반응형

목차는 network 목차 에 있습니다.

[network 1편] 로그인 관련 정리 (세션, JWT)

로그인 하는 방법 중 세션과 JWT 에 대해 비교 정리했습니다.

세션이란?

  • 세션이란 일정 시간동안 같은 사용자로 부터 들어온 접속 상태를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술입니다.

세션 구현 방안

세션을 서버 1대에서 관리

  • 서버 1대에서 key,value 나 서버 메모리에 저장해 관리합니다.
  • 구현이 쉬우나 서버 대수가 늘어날수록 확장이 어렵습니다.
  • sticky session 을 통해 해결이 가능하나, sticky session 의 경우 특정 서버로 트래픽이 몰릴 수 있습니다.
    • sticky session 이란 같은 세션 ID 는 세션을 생성한 서버로만 request 가 가도록 합니다.

Session 클러스터링

  • 세션을 클러스터링 해서 어느 서버로 접근하던 인증이 가능하도록 하는 방법입니다.
  • 이 방법의 문제점은 새로운 서버가 추가될 때, 기존 서버에 세션 전파가 이루어집니다.
  • 세션 전파는 리소스를 소모하며, 작업 도중 세션 불일치가 발생할 수 있습니다.

remote memory 관리

  • session 을 redis 와 같은 remote 저장소에서 관리하는 방법입니다.

    • redis 는 in memory cache 입니다.
  • 서버 대수가 줄거나 늘어나도 remote memory server 에 접근하기에 위에 나온 문제들이 해결 가능합니다.

  • remote memory (redis 와 같은) 또한, HA 설정이 돼있기에 대용량 트래픽 처리가 가능합니다.

    • spring-session-data-redis 와 같은 opensource 사용하여 redis 를 사용하여 세션 기능 구현이 가능합니다.
  • 또한, remote memory 가 장애가 나서 데이터가 없어져도 세션 정보가 사라지는 것이기에 risk 는 없습니다.


JWT 란?

  • JWT 는 사용자에 대한 속성을 저장하는 Claim 기반 Web Token 입니다. (Json 포맷)
  • 즉, 데이터 안에 사용자를 증명하는 수단이 들어있으므로 서버에서는 해당 정보를 저장할 필요 없습니다.
  • 이런 JWT 를 특성을 이용해 로그인을 할 때, 로그인정보를 서버에 저장하지 않고 로그인 기능을 구현할 수 있습니다.

JWT 로그인 문제

  • 서버에 로그인정보가 없기에 중복 로그인인지 체크할 수 있는 방법이 없습니다.
  • 이미 발행한 토큰에 대해 무효화 할 수 있는 방법이 어렵습니다.

JWT 토큰 무효화 방법

  1. 클라이언트에서 토큰 제거합니다. 로그아웃 버튼 등을 눌렀을 때, 클라이언트에서 토큰 제거 로직을 넣어줍니다.
  2. 토큰을 서버에서 보관하는 것입니다.
    • 클라이언트에서 서버로 요청이 들어오면 서버에서는 해당 request 에 대해 데이터베이스 등과 같은 저장소에 접근하여 유효한 접근인지 확인합니다.
    • 이 방법은 상태성을 가지기에 JWT 를 사용할 필요가 없게 합니다. (JWT 는 기본적으로 무상태성의 특징을 지니고 있습니다.)
  3. 토큰 만료 시간을 짧게 유지하는 것입니다.
    • 괜찮은 방법이지만 사용자가 로그인 상태를 오래 유지할 수 없습니다. (불편함)
  4. 토큰의 서명을 변경하는 것입니다.
    • 발급된 모든 토큰을 폐기시키기 위한 방법입니다.
  5. 토큰에 JWT 버전 번호를 기록합니다.
    • 버전 번호를 JWT 안에 넣어놓고, 무효화 시키고자 한다면 새로운 버전 번호를 설정합니다.

JWT 토큰 refresh 와 Refresh Token

  • JWT 의 Access Token 은 JWT 특성상 유효시간을 연장 시킬 수 없습니다. (Token 자체에 유효 시간 정보가 있기에)
  • 그렇기에 Refresh Token 을 사용하는데 Access Token 이 만료됐을 경우 Refresh Token 을 확인해서 토큰을 재발급을 해줄 것인지 결정합니다. (Refrsh Token 은 Access Token 보다 유효 시간이 길어야 합니다.)
  • 이 때, Refresh Token 의 보안을 위해 서버 저장소 (DB 등) 를 살펴봐서 클라이언트 IP, 버전, 디바이스 등의 정보를 확인해서 처음 Access Token 을 받아간 대상인지 확인을 하면 보안 강화를 할 수 있습니다.

결론

  • 서버가 자바이고, 자바 세션을 사용한다면 클라이언트도 자바를 사용해야 세션을 사용할 수 있습니다. 모바일과 같이 다양한 기종의 환경에서는 자바 세션을 사용못할 수 있습니다.
  • 그렇기에 토큰 기반 인증방식인 JWT 가 나왔고, JWT 를 고려해볼 수 있습니다.
  • 단, 위에서도 얘기했지만 JWT 는 만료를 시킬 수 없고, JWT 가 노출될경우 데이터가 그대로 노출되기에 이 부분은 고려해야합니다. 또한, 서로 다른 IP 에 따른 중복 로그인에 대한 방안이 없습니다. (물론 JWT 를 서버에 보관하면 가능은 합니다)

Reference

댓글