본문 바로가기
IT/Data

토큰 기반 인증 시스템 이해하기: 발급, 관리 및 JWT

by Cyber_ 2024. 4. 7.

현대 웹 서비스와 애플리케이션에서 사용자 인증은 필수적인 부분입니다. 토큰 기반 인증 시스템은 이를 위한 효과적인 해결책 중 하나로 자리 잡았습니다. 이 블로그 포스트에서는 토큰이 발급되고 관리되는 방법, 그리고 access 토큰과 refresh 토큰의 차이점에 대해 살펴보겠습니다. 또한, access 토큰을 확인하는 JWTAuthentication에 대해서도 알아보겠습니다.

 

1. 토큰이란 무엇인가?

토큰은 인증된 사용자의 세션 상태를 저장하지 않고 서버가 클라이언트에게 임시적으로 부여하는 문자열입니다. 이는 사용자가 로그인할 때 서버로부터 발급받으며, 이후의 요청에서 이 토큰을 사용하여 자신을 인증합니다. 토큰 기반 인증 시스템에서는 이 토큰이 사용자의 로그인 상태를 대신하여, 서버와 클라이언트 간의 통신을 보안상 안전하게 합니다.

 

2. 토큰의 발급 및 존재 위치

토큰은 사용자가 로그인 정보(예: 이메일과 비밀번호)를 서버에 제공하면 발급됩니다. 서버는 이 정보를 검증한 후, 유효한 사용자임을 확인하면 토큰을 생성하여 반환합니다. 발급된 토큰은 주로 클라이언트 측에서 관리되며, 웹 애플리케이션의 경우 쿠키, 로컬 스토리지, 세션 스토리지 중 한 곳에 저장될 수 있습니다. 이 위치는 보안과 애플리케이션의 요구사항에 따라 달라질 수 있습니다.

 

더보기

쿠키: 서버가 사용자의 웹 프라우저에 저장하는 데이터 조각

- 만료날짜 커스텀 가능

- CSRF 공격에 취약하니 HttpOnly 및 Secure 플래그를 사용하여 XSS공격으로 부터 쿠키를 보호해야 함

 

로컬 스토리지: HTML5에 도입된 Web Storage API의 일부로, 브라우저에 키-값 쌍을 저장하는 방법

- 수동으로 삭제해야함

- 클라이언트 사이드에서만 접근할 수 있음

 

세션 스토리지: Web Storage API의 일부로, 로컬 스토리지와 유사하게 키-값 쌍을 저장

- 브라우저 탭이 닫힐 때 삭제

- 클라이언트 사이드에서만 접근가능

 

3. 토큰의 관리 방법

토큰은 클라이언트 측에서 주의 깊게 관리되어야 합니다. 보안상의 이유로, 토큰을 로컬 스토리지에 저장하는 것이 일반적으로 권장됩니다. 쿠키에 저장할 경우 CSRF(Cross-Site Request Forgery) 공격에 취약할 수 있으나, 적절한 보호 조치를 취하면 쿠키 저장도 안전할 수 있습니다. 중요한 것은, 토큰이 노출되면 누구든지 해당 토큰을 사용하여 사용자를 가장할 수 있다는 점입니다. 따라서, 보안이 강화된 저장 방법을 선택하고, 토큰의 유효기간을 짧게 설정하는 것이 좋습니다.

 

4. Access 토큰과 Refresh 토큰

- Access 토큰

Access 토큰은 사용자가 인증 후 서버로부터 받는 인증 토큰입니다. 이 토큰은 일반적으로 짧은 유효기간(예: 몇 분에서 몇 시간)을 가지며, 사용자가 서버의 보호된 자원에 접근할 수 있게 해줍니다.

 

- Refresh 토큰

Refresh 토큰은 access 토큰의 유효기간이 만료되었을 때 새로운 access 토큰을 받기 위해 사용되는 토큰입니다. 일반적으로 access 토큰보다 훨씬 긴 유효기간을 가지며, 이를 통해 사용자는 로그인을 반복하지 않고도 세션을 유지할 수 있습니다.

더보기

access와 refresh의 값은 서로 다릅니다. 다르게 사용함으로써 보안과 효율성의 이점을 가질 수 있습니다. access 토큰은 탈취되더라도 짧은 시간 내에만 위험에 노출되지만 refresh는 탈취될 경우 더 큰 보안 문제를 일으킬 수 있으므로 따로 사용함으로써 보안을 강화하고 사용자가 자주 로그인 하지 않아도 refresh토큰을 사용함으로써 장기간 서비스를 이용할수 있게 해주빈다. 이렇게 되면 서버는 주기적으로 사용자의 인증상태를 검증할 수 있습니다.

 

5. JWTAuthentication

JWT(Json Web Token)는 토큰을 생성하고 검증하기 위한 개방 표준(RFC 7519)입니다. JWTAuthentication은 사용자가 서버로부터 받은 JWT 토큰을 HTTP 요청에 포함시켜, 서버가 해당 요청이 유효한 사용자로부터 왔는지를 확인하는 메커니즘입니다. JWT는 Header, Payload, Signature의 세 부분으로 구성되어 있으며, 이를 통해 토큰의 무결성과 정보의 보안을 보장합니다.

 

결론

토큰 기반 인증 시스템은 현대 웹 애플리케이션에서 사용자 인증을 관리하는 효율적인 방법입니다. 토큰의 안전한 발급, 저장, 관리 방법을 이해하고 적절히 적용하는 것이 중요합니다. Access 토큰과 Refresh 토큰을 적절히 활용하여 사용자 경험을 개선하고, JWT를 통해 보안성을 높일 수 있습니다. 이러한 지식은 개발자가 보다 안전하고 효율적인 인증 시스템을 구축하는 데 큰 도움이 됩니다.