Token

햄은 개발 공부중·2023년 3월 8일
0
post-thumbnail

Token 🪙

토큰은 사용자의 인증 정보를 서버가 아닌 클라이언트 측에 저장하는 인증 방식으로 기존의 세션 인증 방식과 비교해 서버의 과부하나 메모리 부족 등의 문제를 극복하기 위해 고안되었다.
웹 보안에서의 토큰은 인증과 권한 정보를 담고 있는 암호화된 문자열을 말한다. 이를 이용해서 특정 어플리케이션에 대한 사용자의 접근 권한을 부여할 수 있다.

토큰 인증 방식의 흐름

JWT (JSON Web Token)

토큰 기반 인증 구현 시 대표적으로 사용하는 기술로 JSON 객체에 정보를 담고 이를 토큰으로 암호화하여 전송할 수 있다. 클라이언트가 서버에 요청을 보낼 때, 인증정보를 암호화된 JWT 토큰으로 제공하고, 서버는 이 토큰을 검증하여 인증정보를 확인할 수 있다.

JWT의 구성

" . "으로 나누어진 세 부분이 있으며 각각 Header, Payload, Signature라고 부른다.

  1. Header (토큰의 종류, 알고리즘의 사용)
    토큰 자체를 설명하는 데이터가 담겨있다. 토큰의 종류와 시그니처를 만들 때 사용할 알고리즘을 JSON형태로 작성하고 JSON객체를 base64형태로 인코딩하면 완성이다

    {
    "alg": "HS256",
    "typ": "JWT"
    }```
    
  2. Payload (유저 정보, 권한 부여 여부, 기타 정보)
    토큰으로 전달하려는 내용물을 담고 있는 부분이며 어떤 정보에 접근이 가능한지에 관한 권한, 유저의 이름과 같은 개인정보, 토큰의 발급 시간 및 만료 시간 등의 정보들을 JSON 형태로 담고 JSON객체를 base64형태로 인코딩하면 된다.

{
 "sub": "someInformation",
 "name": "phillip",
 "iat": 151623391
}
  1. Signature (Header, Payload의 인코딩 값 + salt로 암호화된 값)
    토큰의 무결성을 확인할 수 있는 부분으로 Header와 Payload가 완성되었다면, Signature는 이를 서버의 비밀 키(암호화에 추가할 salt)와 header에서 지정한 알고리즘을 사용해서 해싱한다.

토큰 인증 방식의 장점

  • 무상태성 : 서버는 비밀 키를 통해 클라이언트가 보낸 토큰의 유효성만 검사하면 되기 때문에 무상태적인 아키텍쳐 구축 가능
  • 확장성 : 다수의 서버가 공통된 세션 데이터를 가질 필요가 없기 때문에 서버를 확장하기 더 용이함
  • 자유롭게 토큰 생성 가능 : 토큰의 생성 / 검증이 하나의 서버에서만 이루어지지 않아도 되기 때문에 토큰 생성만을 담당하는 서버 구축이 가능 (이를 이용해 여러 서비스 간의 공통된 인증 서버 구현도 가능!)
  • 권한 부여 용이 : 토큰은 인증 상태, 접근 권한 등 다양한 정보를 담을 수 있기 때문에 사용자 권한 부여에 용이하다. (이를 통해 어드민 권한 부여, 정보에 접근 가능한 범위 설정도 가능!)

토큰 인증 방식의 단점

  • 무상태성 : 인증 상태를 관리하는 주체가 서버가 아닌 것이 위처럼 장점이 될 수 있으나, 토큰이 탈취되어도 해당 토큰을 강제로 만료시킬 수 없어 사용자로 가장해 계속해서 요청을 보낼 수 있다.
  • 유효기간 : 토큰이 탈취될 상황을 대비해서 유효 기간을 짧게 설정 할 경우, 사용자는 토큰이 만료될 때마다 다시 로그인을 진행해야 하기 때문에 좋지 않은 사용자 경험을 제공하게 된다.(그렇다고 유효 기간을 길게 설정하면 토큰이 탈취되면 더욱 치명적인 피해를 입게 될 수 있으니 주의!!)
  • 토큰의 크기 : 토큰에는 여러 정보를 담을 수 있는 만큼, 많은 데이터를 담으면 그만큼 암호화하는 과정도 길어지고 토큰의 크기도 거치기 때문에 네트워크 비용의 문제가 생길 수 있다.

액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token)

Access Token(실제 출입용 토큰)

서버에 접근하기 위한 토큰으로 위에서 말한 토큰과 비슷한 역할을 한다. 즉 보안을 위해 보통 24시간 정도의 짧은 유효기간으로 설정되어 있다.

Refresh Token(엑세스 토큰 재발급을 위한 토큰)

서버 접근을 위한 토큰이 아닌 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용되는 토큰으로 액세스 토큰보다 유효기간을 길게 설정해야 한다.

리프레시 토큰의 도입이 모든 문제를 해결해 주는 것은 아니지만 리프레시 토큰은 긴 유효 기간을 갖고 있어 해당 토큰마저 탈취된다면 토큰의 긴 유효 기간 동안 악의적인 유저가 계속해서 엑세스 토큰을 생성하고 사용자의 정보를 해킹할 수 있기 때문에 이에 대한 대비책으로 리프레시 토큰을 세션처럼 서버에 저장하고 상태를 관리하기도 한다.

profile
내가 보려고 정리하는 블로그🔥

0개의 댓글