선발대

[유튜브] 얄팍한 코딩사전 / 세션과 JWT 본문

공부/유튜브

[유튜브] 얄팍한 코딩사전 / 세션과 JWT

신선한 스타트 2022. 7. 3. 17:27
세션 VS. 토큰! JWT가 뭔가요?

링크: https://www.youtube.com/watch?v=1QiOXWEbqYQ 

 

 

 

인증과 인가의 차이점

 

  • 인증(Authentication): 유저나 디바이스의 신원을 확인하는 것. HTTP 메시지에 누군지 적어서 서버로 요청 보냄.
  • 인가(Authorization): 유저나 디바이스에게 접근 권한을 허가하거나 거부하는 것

 

세션 & 쿠키

 

  • 세션: 서버 쪽에 저장하는 정보
  • 쿠키: 클라이언트의 자체적인 임시저장소

 

  • 로그인이 성공하면 세션 표딱지를 반으로 갈라서 하나는 사용자 브라우저에 세션 ID(쿠키)로 저장하고,
  • 다른 한 쪽은 서버의 자기 책상, 창고 등(DB, 메모리, 하드디스크 등)에 올려놓는다. 
  • Stateful: 모든 사용자의 상태를 기억함. 덕분에 기억하는 대상의 상태들을 언제든 제어 가능.

 

  • 처음 로그인 하면 서버에셔 해당 로그인 정보로 세션을 생성함.
  • 그리고 클라이언트에 세션 ID를 응답으로 보냄.
  • 클라이언트는 세션 ID를 쿠키 저장소에 보관함.
  • 이후 클라이언트는 요청 보낼 때마다 세션 ID를 쿠키에서 꺼내서 HTTP 헤더에 넣고 전송함.
  • 서버는 세션 ID를 바탕으로 저장된 세션을 탐색해 요청 보낸 유저 맞는지 확인하고 인증함.

 

  • 장점: 세션 ID에 의미있는 정보가 없어서 HTTP 요청이 탈취되어도 ID, PW 노출되지 않음.
  • 단점: 누군가 세션 ID를 헤더에 넣고 요청하면, 이게 진짜 사용자인지 확인할 길이 없음.

 

토큰 &JWT

 

  • 회원가입 시 유저에 매칭되는 토큰을 생성하여 저장.
  • 로그인 요청이 들어오면 해당 토큰을 응답으로 보내줌.
  • 클라이언트는 토큰을 잘 가지고 있다가 요청 보낼 때 헤더에 토큰을 넣어서 보냄.
  • 서버는 요청으로 들어온 토큰이 있는지 확인하고 인증해준다. (일일히 DB 뒤져서 찾아낼 필요가 없음)

 

  • 세션&쿠키 방식과 다르게 토큰 자체에 사용자에 대한 정보가 있어서 서버는 토큰으로만 사용자 구분가능.
  • Stateless: 시간이 지나도 변하지 않는 값. 통제가 되지 않으므로 유효기간을 짧게 준다.
  • 일반적으로 access 토큰(실사용, 만료되면 서버로 보냄), refresh 토큰(재발급용, DB 저장) 2개 발급함.
  • JWT 확인할 수 있는 사이트: https://jwt.io/
  • 3가지 데이터를 이어붙인다: Header(헤더), Payload(페이로드), Verify Signature(서명)

 

  • Header
  • type: JWT (고정값임)
  • alg: 알고리즘의 약자. 서명 만들 때 필요한 알고리즘을 지정함. (HS256)

 

  • Payload
  • Base64로 디코딩해보면 사용자 정보, 유효기간, 관리자 여부 등 서비스 측에서 원하는 대로 담은 정보가 담겨있음.
  • 이렇게 토큰에 담긴 사용자 정보 등의 데이터를 Claim이라고 함.
  • 민감한 정보는 담지 않아야 함. 디코딩하면 쉽게 노출 될 수 있음. 식별하기 위한 정보만을 담아둬야 함.

 

  • Verify Signatue
  • [Header + Payload + 서버에 감춰둔 비밀값(SECRET_KEY)]을 암호화 알고리즘에 돌리면 Verify Signature이 나옴.
  • 따라서 Payload의 값이 하나라도 변경되면 서명과 일치하지 않으므로 인증이 거부됨.
  • 이 암호화 알고리즘은 한쪽 방향으로는 인코딩되어도 반대쪽 방향으로는 디코딩이 안됨. (시크릿키 찾아낼 수 없음)
  • SECRET_KEY: 암호화에 필요한 키. settings.py에 있음. 키 노출에 조심해야 함.
  • 서버와 클라이언트 사이에서 주고 받기만 하고 관리는 전적으로 서버에서만 한다.

 

Comments