토큰? 쿠키? 세션? - 토큰

오찬주·2025년 2월 9일

Study Log

목록 보기
7/15
post-thumbnail

웹 개발을 하다보면 필연적으로 듣게 되는 용어가 있다.

토큰 쿠키 세션

웹에서 사용자 인증과 상태 유지를 위해 사용되는 주요 개념이다.
웹 개발에서 많이 들어서 익숙하지만 언제 어떤걸 써야 적절할까?
그리고 써야 할까?

우선, 토큰 편이다 !


토큰

인증을 위한 보안 토큰으로 주로, JWT(Json Web Token)이 사용된다.
클라이언트에서 저장하게 되며 주로 로컬 스토리지에 저장한다.

토큰 인증 방식

  1. 사용자가 로그인을 한다.
  2. 서버가 클라이언트를 인증 후 인증 정보를 포함한 토큰을 발급한다.
  3. 클라이언트는 서버에서 전달받은 토큰을 쿠키나 스토리지에 저장해둔다.
  4. 클라이언트가 서버에 요청할때마다 토큰을 요청 헤더에 포함시켜 전달하고 인증을 수행한다.

보통 프론트엔드에서 백엔드 api를 호출할때 로컬 스토리지에서 access token을 꺼내서 사용하는 것을 많이 봤을 것이다.

토큰의 특징

  • Stateless: 서버에 사용자 상태를 저장하지 않는다.
  • 보통 HTTP 헤더에 포함하여 전송한다.
  • 보안성이 높다. 암호화 및 서명이 가능하다.
  • 특정 시간 후 만료된다.

OAuth 인증(구글, 페이스북 로그인)이나 RESTful API 인증 등에서 사용된다.

JWT에 대해 알아보자

JWT(JSON Web Token)은 json 형식으로 정보를 안전하게 주고 받을 수 있는 토큰 기반 인증 방식이다. 주로 사용자 인증, 권한 부여에 사용된다.

💡 JWT의 특징

  • 토큰 기반 인증: 서버가 사용자 세션을 저장할 필요 없이, 토큰을 통해 인증이 이루어진다.
  • 자체 포함: 사용자 정보와 권한이 토큰 안에 포함되어 있다.
  • 안전한 서명: HMAC, RSA 등의 알고리즘으로 서명되어 변조 방지가 가능하다.
  • Stateless: 서버가 별도로 상태를 저장하지 않으므로 확장성이 좋다.
  • Base64 인코딩: JWT는 Base64 URL Safe 방식으로 인코딩되어 쉽게 전송 가능하다.

💡 JWT의 구조
크게 3개의 부분으로 구성된다.
헤더 + 페이로드 + 서명

각 부분은 .으로 구분된다.

Header(헤더)는 JWT의 타입과 서명 알고리즘 정보를 포함하는 부분이다.
Payload(페이로드)는 사용자의 정보(claim)을 포함하는 부분이다. 페이로드에 담긴 데이터는 Base64로 인코딩되지만, 암호화되지는 않기에 민감한 정보는 포함하지 않도록 주의해야 한다.
Signature(서명)은 JWT의 무결성은 보장하는 부분으로, 헤더와 페이로드를 조합한 후 secret key로 서명한다.

🚨 JWT에서 주의해야 할 점

  • 엑세스 토큰이 유출되면 만료될 때까지 악용 가능하기에 리프레시 토큰을 사용해 보안 강화가 필요하다.
  • 한번 발급된 JWT는 수정이 불가능하다.
  • 토큰이 크면 네트워크 비용이 증가한다.

그렇다면 Access Token과 Refresh Token은 무엇일까?

Access Token

사용자가 로그인하면 서버가 발급하는 토큰으로 API 요청을 인증할 때 사용된다. 일반적으로 짧은 유효 기간을 가지고, 만료되면 더 이상 사용할 수 없다.

Refresh Token

엑세스 토큰이 만료되었을 때, 새로운 액세스 토큰을 발급받기 위한 토큰이다. 일반적으로 엑세스 토큰보다 긴 유효 기간을 가진다. 보안 강화를 위해 엑세스 토큰과 달리 서버에 저장하는 경우도 있다.

왜 리프레시 토큰이 필요할까??
엑세스 토큰만 사용해서 유효기간을 왕창 늘려놓으면 보안 위험이 증가한다.. 반대로 유효기간이 너무 짧으면 사용자는 자꾸 자꾸 로그인해야 해서 불편함을 느끼게 된다.

리프레시 토큰을 추가하면 엑세스 토큰을 짧게 설정해 보안을 강화할 수 있고, 사용자는 자주 로그인 하지 않아도 로그인 유지가 가능한 장점을 가지게 되는 것이다 !!

profile
프론트엔드 엔지니어를 희망합니다 :-)

0개의 댓글