헷갈려서 정리하는 [세션 vs 토큰]

Hyun Jung·2021년 10월 27일
1

오늘의 주제는 로그인에 관련된 세션 vs 토큰

인증(Authentication) - 쉽게 말해서 로그인이라고 생각하면 됨. 내가 이 사이트에 가입된 회원임을, 즉 특정 서비스에 일정 권한이 주어진 사용자임을 아이디랑 패스워드 등을 통해 인증을 받는다.
인가(Authorization) - 이렇게 인증을 받은 사용자가 즉, 서버가 얘가 로그인 한 사용자라는 걸 알아보고 응 어서와~ 하고 허가해주는 것

  • 세션

    • 서버에 세션 ID가 실려오면 서버는 메모리에서 맞는 짝이 있는지 찾고 있으면 인가를 해주는 과정
    • 단점이 있다면, 에러가 생겨서 서버를 재부팅 할 때 사용자들은 로그인을 다시 해야됨 -> 이러한 단점을 보완해주는게 JWT방식이다
  • '토큰 방식' JWT

    • 사용자가 로그인을 하면 토큰이 XXXXX.YYYYY.ZZZZZ 이런식으로 보내진다
    • 마침표로 구분되어 총 3부분으로 나뉘어져 있는데 각각 Header, Payload, Signature 로 나뉘어진다
    • 두번째 payload에 대해 설명해보자면 이 토큰을 누가 누구에게 발급했는지, 서비스가 사용자에게 이 토큰을 통해 공개하기 원하는 내용, 이를테면 사용자의 닉네임이나 서비스상의 내용 등의 데이터를 담는다.
    • 이렇게 사용자가 갖고 있는 토큰 자체에 이런 정보들이 들어있으면 서버가 요청마다 일일이 데이터베이스에서 뒤져봐야할 것들이 줄어든다.
    • 1번 헤더를 디코딩해보면 type(말 그대로 타입), alg이 나오는데 alg은 알고리즘의 약자임. 이 아이는 3번 서명 값을 만들기 위한 알고리즘을 지정할 수 있음. HS256 등 여러 암호화 방식 중 하나를 지정할 수 있다

토큰은 데이터를 저장하지 않지만 세션은 데이터를 저장한다

  • 토큰은 Stateless하지만 세션은 Stateful 하다.

위의 특징처럼 세션을 대체하기에 JWT에는 큰 결점이 있다.
Stateful한 특징을 가진 세션처럼 모든 사용자의 상태를 기억한다는건 기억한 사용자를 언제든 제어할 수 있다는 말이다.

  • 예를 들어 한 기기에서만 로그인 가능한 서비스를 만들려는 경우 PC에 로그인 되어 있는 사용자가 모바일에서 로그인 할 때 기존 PC에 등록되어있는 기존 세션을 종료시켜버린다.

반면에 토큰이 해커에게 탈취당한 경우 해커가 가져가버린 토큰에 대해 아무런 방어적인 행동을 할 수 없다.이런 점을 막기 위해 사용하는 방법이 있는데 여러 방법들 중 하나로는 만료 시간 가깝게 잡아서 토큰의 수명을 아주 짧게 주는 것이다.

  • 로그인을 하고나면 수명이 짧은 access 토큰, 수명이 2주 정도인 refresh 토큰 2개를 준다.
  • access 토큰이 수명이 끝났을 때 refresh 토큰을 보낸다. 서버는 그걸 데이터베이스에 대조한 값과 대응해보고 맞다면 새로운 access 토큰을 발급해준다.
  • 즉, 매번 인가를 받을 때 쓰는 수명 짧은 토큰이 access(액세스) 토큰이고 액세스 토큰을 재발급 받을때 쓰는 게 refresh(리프레쉬) 토큰이다. 그렇게 하면은 중간에 액세스 토큰이 탈취 당해도 오래 쓰지는 못한다. 누구를 강제 로그아웃 시킬려면 리프레쉬 토큰을 갖다가 DB에서 지워버려 갱신이 안되게 할 수 있지만 이렇게 해도 짧게나마 액세스 토큰이 살아있는 동안은 이걸 바로 차단할 방법이 없다. 토큰 하나로만 사용하는 것보다는 낫지만 완벽한 방법이 아니다.
  • 아무리 JWT가 구현하기 편하고 좋더라도 이런 한계가 있다. 이를 적용하기에 내 서비스가 적합한지 먼저 고려해야한다.
profile
Fontend Engineer

0개의 댓글

관련 채용 정보