[Spring] 토큰 기반 인증

토큰 기반 인증이란?

  • 스프링 시큐리티로 로그인/로그아웃에서는 기본적으로 시큐리티에서 제공해주는 세션 기반 인증을 사용
    • 사용자마다 사용자의 정보를 담은 세션을 생성하고 저장해서 인증
  • 토큰 기반 인증은 토큰을 사용
    • 토큰은 서버에서 클라이언트를 구분하기 위한 유일한 값
    • 서버가 토큰을 생성해서 클라이언트에게 제공하면, 클라이언트는 이 토큰을 갖고 있다가 여러 요청을 이 토큰과 함께 신청
    • 서버는 토큰으로만 유효한 사용자인지 검증

토큰을 전달하고 인증받는 과정

  1. 클라이언트가 아이디와 비밀번호를 서버에게 전달하면서 인증 요청
  2. 서버는 아이디와 비밀번호를 확인해 유효한 사용자인지 검증. 유효한 사용자일 경우 토큰을 생성해서 응답
  3. 클라이언트는 서버에서 제공한 토큰을 저장
  4. 이후 클라이언트는 인증이 필요한 API를 사용할 때 토큰을 함께 전송
  5. 서버에서 토큰의 유효성 검증
  6. 유효할 경우 클라이언트가 요청한 내용을 처리

토큰 기반 인증의 특징

  • 무상태성
    • 상태를 관리한다 : 사용자의 인증 상태를 유지하면서 이후 요청을 처리하는 것
    • 토큰 기반 인증에서는 클라이언트에서 인증 정보가 담긴 토큰을 생성하고 인증
    • 서버 입장에서는 클라이언트의 인증 정보를 저장하거나 유지하지 않아도 되기 때문에 완전한 무상태(stateless)로 효율적인 검증 가능
  • 확장성
    • 서버 확장시 상태 관리를 신경쓸 필요가 없기 때문에 서버 확장에도 용이함
  • 무결성
    • 토큰 방식은 HMAC(hash-based message authentication)기법이라고도 부름
    • 토큰 발급 이후에는 토큰 정보를 변경할 수 없음 = 토큰의 무결성 보장

JWT

JWT의 구조

JWT는 .을 기준으로 헤더(header), 내용(payload), 서명(signiture)로 이루어져 있음

  • 헤더 : 토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담음
이름 설명
typ 토큰의 타입을 지정. JWT라는 문자열이 들어가게 됨
alg 해싱 알고리즘 지정
  • 내용 : 토큰과 관련된 정보
    • 클레임(claim) : 내용의 한 덩어리, 클레임은 키값의 한 쌍으로 이루어짐. 등록된 클레임, 공개 클레임, 비공개 클레임으로 구분됨
  • 서명 : 해당 토큰이 조작되었거나 변경되지 않았음을 확인하는 용도로 사용, 헤더의 인코딩값과 내용의 인코딩값을 합친 후에 주어진 비밀키를 사용해 해시값을 생성

Categories:

Updated:

Leave a comment