JWT 토큰기반인증

Sirius·2024년 7월 16일

토큰기반 인증

  • 사용자 인증 확인 방법
    1) 서버 기반 인증: ex> 스프링시큐리티의 세션기반인증
    2) 토큰 기반 인증: 서버가 토큰을 클라이언트에게 제공, 클라이언트는 이 토큰으로 신청하는 방식

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

토큰기반 인증의 특징

1) 무상태성

토큰을 클라이언트가 저장한다. 따라서 상태관리는 클라이언트가 한다.

2) 확장성

서버가 상태관리를 신경 쓸 필요가 없기에 서버 확장에도 용이함.

3) 무결성

토큰 방식은 HMAC 기법이다.
해시는 일방향성이라는 특징을 갖는다.
따라서 해시를 적용하는 것은 쉽지만 원본값을 알아내기는 무척어렵기 때문이다.
따라서 토큰을 발급한 이후에 토큰정보를 변경하면 인증에 성공할 수 없다.

HMAC 기법이란?

HMAC(Hashed Message Authentication Code)은 메시지의 무결성과 인증을 보장하기 위해 사용되는 해싱 알고리즘이다.
HMAC은 두 개의 주요 구성 요소로 구성된다:

1) 해시 함수 (예: SHA-256)
2) 비밀 키 (Secret Key)

JWT

속성 정보(Claim)를 JSON 데이터 구조로 표현한 토큰이다.
JWT는 헤더(header), 내용(payload), 서명(signature)로 이루어져 있다.

1) 헤더(header)

토큰의 타입과 해싱 알고리즘을 지정하는 정보를 담는다.

{
	"typ": "JWT",
    "alg": "HS256"
}

2) 내용(payload)

토큰과 관련된 정보를 담는다.
내용의 한 덩어리를 클레임이라고 부른다.
클레임은 1) 등록된 클레임, 2) 공개 클레임, 3) 비공개 클레임으로 나뉜다.

{
	"iss": "test@gmail.com", //등록된 클레임(토큰 발급자)
    "iat": 1622370878, // 등록된 클레임(토큰 발급시간)
    "exp": 1622372678,// 등록된 클레임(토큰 만료시간)
    "https://test.com/jwt_claims/is_admin": true, // 공개 클레임
    "email": "test@gmail.com", // 비공개 클레임
    "hello": "안녕하세요!" // 비공개 클레임
}

3) 서명

해당 토큰의 무결성을 검증하는 용도
헤더와 내용의 인코딩 값을 합친 후에 비밀키를 이용하여 해싱한 값을 사용한다.

토큰유효기간

  • Q: 토큰의 유효기간을 길게 한다면?
    A: 그 토큰을 탈취한다면 이용할 수 있는 기간이 길어짐

  • Q: 토큰의 유효기간을 짧게 한다면?
    A: 사용자 입장에서 토큰을 계속 발급받아야 해서 불편함

위의 모든 것을 리프레시 토큰으로 해결할 수 있다.
리프레시 토큰은 사용자를 인증하기 위한 용도가 아니라 액세스 토큰이 만료되었을때 새로운 액세스 토큰을 발급하기 위해 사용한다.


이렇게 하면 액세스토큰의 유효기간을 짧게하고, 리프레시 토큰의 유효기간을 길게하여 위의 문제를 해결할 수 있다.

0개의 댓글