토큰은 사용자의 인증 정보를 서버가 아닌 클라이언트 측에 저장하는 인증 방식으로 기존의 세션 인증 방식과 비교해 서버의 과부하나 메모리 부족 등의 문제를 극복하기 위해 고안되었다.
웹 보안에서의 토큰은 인증과 권한 정보를 담고 있는 암호화된 문자열을 말한다. 이를 이용해서 특정 어플리케이션에 대한 사용자의 접근 권한을 부여할 수 있다.
토큰 기반 인증 구현 시 대표적으로 사용하는 기술로 JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송할 수 있다. 클라이언트가 서버에 요청을 보낼 때, 인증정보를 암호화된 JWT 토큰으로 제공하고, 서버는 이 토큰을 검증하여 인증정보를 확인할 수 있다.
" . "으로 나누어진 세 부분이 있으며 각각 Header, Payload, Signature라고 부른다.
Header (토큰의 종류, 알고리즘의 사용)
토큰 자체를 설명하는 데이터가 담겨있다. 토큰의 종류와 시그니처를 만들 때 사용할 알고리즘을 JSON형태로 작성하고 JSON객체를 base64형태로 인코딩하면 완성이다
{
"alg": "HS256",
"typ": "JWT"
}```
Payload (유저 정보, 권한 부여 여부, 기타 정보)
토큰으로 전달하려는 내용물을 담고 있는 부분이며 어떤 정보에 접근이 가능한지에 관한 권한, 유저의 이름과 같은 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보들을 JSON 형태로 담고 JSON객체를 base64형태로 인코딩하면 된다.
{
"sub": "someInformation",
"name": "phillip",
"iat": 151623391
}
서버에 접근하기 위한 토큰으로 위에서 말한 토큰과 비슷한 역할을 한다. 즉 보안을 위해 보통 24시간 정도의 짧은 유효기간으로 설정되어 있다.
서버 접근을 위한 토큰이 아닌 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰으로 액세스 토큰보다 유효기간을 길게 설정해야 한다.
리프레시 토큰의 도입이 모든 문제를 해결해 주는 것은 아니지만 리프레시 토큰은 긴 유효 기간을 갖고 있어 해당 토큰마저 탈취된다면 토큰의 긴 유효 기간 동안 악의적인 유저가 계속해서 엑세스 토큰을 생성하고 사용자의 정보를 해킹할 수 있기 때문에 이에 대한 대비책으로 리프레시 토큰을 세션처럼 서버에 저장하고 상태를 관리하기도 한다.