Post

JWT 란?

JWT 란?

JWT(JSON Web Token)는 웹에서 인증과 권한 부여(인가)에 널리 사용되는 방식으로, 서버와 클라이언트가 인증 정보를 주고받을 때 사용되는 JSON 기반의 토큰이다. 보통 인증이 필요한 웹 서비스에서 사용자 정보를 안전하게 교환하기 위해 이용되며, 토큰 자체에 서명(signature)을 포함해 위변조 여부를 쉽게 식별할 수 있음.

*인증, 인가에 대해서는 이전에 간단히 다룬 글1이 있으니, 이를 확인하자.

1. Access Token과 Refresh Token은 왜 존재할까?

보통 JWT(JSON Web Token)를 사용할 때 Access Token과 Refresh Token 두 가지를 함께 사용하게 되는데, access token 이 서버와 통신할 때 주로 쓰이고 refresh token 은 갱신을 위한 것이다.

  • Access Token: 유저가 인증에 성공하면 발급되는 토큰으로, 실제 API 요청 때 Authorization 헤더에 넣어서 서버 쪽에 권한을 증명하는 데 쓰임. 보통 유효 기간을 짧게 설정함.
  • Refresh Token: Access Token이 만료됐을 때, 다시 로그인할 필요 없이 새 Access Token을 발급받을 수 있도록 해주는 토큰이다. 유효 기간이 더 길게 설정되어 있어 갱신을 위해 사용한다.

이렇게 두 개로 나눠 쓰는 이유는, 보안을 강화하기 위해서다. Access Token 은 서버와 통신할 때 사용하는 주요한 토큰이니 짧은 시간만 유효하게 해놓고, 추가로 Refresh Token을 별도로 관리함으로써, 만약 유저의 Access Token 이 노출 되더라도 오랜 시간 사용할 수 없게 하는 것이다.

2. 쿠키, 세션, 토큰은 각각 무엇?

  • 쿠키: 브라우저에 저장되는 작은 데이터 조각 같은 것이다. 서버가 Set-Cookie라는 헤더로 클라이언트(브라우저)에게 저장을 시키면, 이후 서버에 요청할 때 이 쿠키를 담아서 보내게 된다.
  • 세션: 서버 쪽에서 사용자 정보를 저장해두고, 사용자의 브라우저(혹은 클라이언트)에 세션 ID를 쿠키로 줘서 인증을 유지하는 방식이다. 즉, 실제 사용자 상태 정보는 서버에 있고, 클라이언트는 그저 키(세션 ID)만 들고 다니는 셈이다.
  • 토큰: 지금 다루고 있는 JWT 같은 방식으로, 인증에 필요한 정보를 인코딩/서명해서 만든 문자열이다. 클라이언트가 이 문자열을 Authorization 헤더나 쿠키 등에 담아서 보내고, 유효한 토큰일 경우 서버로 부터 인증이 되고, 인가를 받는 것이다.

3. 각 Token은 어디에 저장해야 안전할까?

  • Access Token: 보통은 브라우저의 메모리나 쿠키(또는 클라이언트 스토리지)에 저장한다. 근데 XSS 공격 등에 노출될 위험이 있기 때문에, HttpOnly Cookie로 저장하거나, 로컬 스토리지에 저장하되 별도의 대책(CSRF 방어, XSS 방지 등)을 마련하는 게 중요하다.
  • Refresh Token: Access Token 보다 더 민감하고 유효 기간이 길기 때문에, 가장 안전하게 보호해야 한다. 일반적으로 HttpOnly Cookie에 저장해서 JS로 접근할 수 없게 만들어야 한다. 이렇게 하면 개발자 콘솔에서 토큰을 직접 확인하지 못하게 되기에, 보안이 한층 올라갑니다.

Access Token이 만료되면, Refresh Token을 이용해 재발급을 받고, 모든 교환은 보안이 보장된 상태(HTTPS)에서 처리하면 보안 문제를 조금 덜 수 있게 되는 것이다!

This post is licensed under CC BY 4.0 by the author.