세션 vs 토큰: 세션과 토큰의 차이점

하스레·2022년 3월 26일
0
  • 인증(Authentication)
    : 쉽게 말해 로그인을 말한다.
  • 인가(Authorization)
    : 인증을 받은 사용자가 이후 서비스의 기능들을 사용할 때 해당 계정에서만 그 기능을 사용하게 서비스에서 사용자를 알아보고 허가해주는 것(로그인이 유지되는 상태에서 일어나는 일)

어떤 사용자가 로그인되어있다는 사실을 서버가 인지할 수 있게 해주는 방법

-> 로그인은 일단 꽤 무거운 작업이다. 데이터베이스에 저장된 사용자 계정의 해시값등을 꺼내와서 계산하고 일치하는지 확인해야함. 따라서 요청마다 아이디, 비번을 실어보낼수 없음. 보안도 위험

세션(stateful)

  • 사용자가 로그인에 성공하면 서버는 세션을 만들어서 반으로 찢어서 반쪽은 사용자의 브라우저로 보내고 반쪽은 메모리, 하드, 디비 등에 저장. 사용자의 브라우저는 이 반쪽을 Session ID란 이름의 쿠키로 저장하고 서버에 요청을 보낼때마다 이 걸 실어보냄. -> 단점 많다.

토큰(stateless)

  • 사용자가 로그인에 성공하면 서버가 토큰을 만들어서 준다. 반으로 찢지 않고 그냥 준다. 즉, 서버는 뭔가를 기억하고 있지 않는다.

  • JWT(Json Web Token)은 마침표를 기준으로 1.헤더 2. 페이로드 3. 서명으로 나뉨

  • Claim: 토큰에 담긴 사용자 정보 등의 데이터

  • 헤더엔 type으로 JWT가 들어감, alg는 3.서명을 만드는데 사용한 알고리즘이 지정됨

  • 헤더와 페이로드, '서버에 감춰놓은 비밀 값'을 이 암호화 알고리즘에 넣고 돌리면 서명값이 나오는 것.

JWT 보완

  • 로그인하면 토큰 두개 주기
  1. 수명이 몇시간이나 몇분 이하로 짧은 access토큰

  2. 보통 2주정도로 꽤 긴 refresh 토큰 -> 상응값을 데이터베이스에도 저장

-> 사용자는 access토큰의 수명이 다하면 refresh 토큰을 보낸다. 서버는 그걸 데이터베이스에 저장된 값과 대조해보고 맞다면 새로운 access 토큰을 발급

-> refresh 토큰만 안전하게 관리해주면 됨.

참고: https://www.youtube.com/watch?v=1QiOXWEbqYQ

profile
Software Developer

0개의 댓글