로그인 인증과 API 보안, 같은 토큰인데 왜 다르게 작동할까요? 이 포스팅에서는 인증 토큰과 보안 토큰의 개념 차이를 실제 코드와 함께 명확히 정리해 드립니다.
안녕하세요, ICT Leader입니다. 많은 개발자들이 JWT나 OAuth 토큰을 보안 토큰으로 잘못 이해하거나, AWS와 같은 클라우드 환경에서 Security Token의 유효성을 간과하는 경우가 많습니다. 오늘은 이 둘의 차이를 명확히 설명하고, Spring Boot + AWS 환경에서도 적용 가능한 실전 예제를 함께 소개하겠습니다.
바로가기 목차
1. 토큰(Token)이란 무엇인가?
토큰(Token)은 인증이나 권한 부여를 위해 시스템이 사용자에게 발급하는 디지털 인증서의 일종입니다. API 통신이나 세션 없이 사용자 상태를 유지할 수 있게 해주며, 시스템 간 신뢰를 부여하는 핵심 수단입니다.
보안 관점에서는 크게 두 종류로 구분됩니다:
- 인증 토큰 (Authentication Token): 사용자의 신원을 확인하고, 로그인 상태 유지
- 보안 토큰 (Security Token): 권한 제어, 리소스 보호, 한시적 접근 통제
2. 인증 토큰(JWT)의 구조와 예제
JWT(Json Web Token)는 사용자의 로그인 상태를 서버가 기억하지 않고도 유지할 수 있도록 도와주는 토큰입니다. 아래는 Spring Boot에서 JWT를 발급하는 기본 예제입니다.
.setSubject(user.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(SignatureAlgorithm.HS256, secretKey)
.compact();
JWT는 헤더(Header) + 내용(Payload) + 서명(Signature)의 3부분으로 구성되어 있으며, Base64로 인코딩되어 전송됩니다. 실무에서는 이 토큰을 Authorization: Bearer <token>
헤더로 서버에 전달합니다.
3. 보안 토큰(Security Token)의 활용
보안 토큰은 인증 이후, **민감한 리소스에 접근하거나 외부 시스템과의 통신을 제어할 때** 사용됩니다. 예를 들어, AWS에서는 STS(Security Token Service)를 통해 임시 자격증명을 발급하며, 제한된 권한과 유효시간을 설정할 수 있습니다.
아래는 AWS CLI를 이용해 보안 토큰을 요청하는 명령 예시입니다:
--role-arn "arn:aws:iam::123456789012:role/S3AccessRole" \
--role-session-name "MySession"
위 명령을 통해 발급된 토큰은 다음과 같은 세 개의 값을 포함합니다:
AccessKeyId
– 임시 사용자 키SecretAccessKey
– 임시 비밀번호SessionToken
– 이 세션만을 위한 토큰
보안 토큰은 일시적이지만 강력한 권한을 제공하므로, 노출되면 큰 사고로 이어질 수 있습니다. 따라서 반드시 다음과 같은 보호 조치를 병행해야 합니다:
- 토큰 유효시간 최소화
- 정책 기반 리소스 제한 (예: S3 읽기 전용)
- 서버-서버 환경 외 외부에 노출 금지
4. 실무 Q&A – 토큰 보안
기본적으로 JWT는 서명되어 위변조는 어렵지만, 민감한 정보를 포함하면 안 됩니다. 저장은 localStorage
보다 httpOnly cookie
사용을 추천합니다.
보안 토큰은 보통 강력한 권한을 갖고 있으므로, 유출 시 즉시 회수 또는 만료 처리가 필요합니다. 로그 모니터링과 CloudTrail 같은 이력 분석도 반드시 병행해야 합니다.
RefreshToken은 인증 토큰이지만, 장기 유효성과 재발급 기능 때문에 보안 토큰처럼 관리되어야 합니다. 유출되면 장기 세션 유지가 가능하므로 보안 등급은 높게 설정해야 합니다.
5. 보안 토큰(Security Token)의 활용
보안 토큰은 인증 이후, **민감한 리소스에 접근하거나 외부 시스템과의 통신을 제어할 때** 사용됩니다. 예를 들어, AWS에서는 STS(Security Token Service)를 통해 임시 자격증명을 발급하며, 제한된 권한과 유효시간을 설정할 수 있습니다.
아래는 AWS CLI를 이용해 보안 토큰을 요청하는 명령 예시입니다:
--role-arn "arn:aws:iam::123456789012:role/S3AccessRole" \
--role-session-name "MySession"
위 명령을 통해 발급된 토큰은 다음과 같은 세 개의 값을 포함합니다:
AccessKeyId
– 임시 사용자 키SecretAccessKey
– 임시 비밀번호SessionToken
– 이 세션만을 위한 토큰
보안 토큰은 일시적이지만 강력한 권한을 제공하므로, 노출되면 큰 사고로 이어질 수 있습니다. 따라서 반드시 다음과 같은 보호 조치를 병행해야 합니다:
- 토큰 유효시간 최소화
- 정책 기반 리소스 제한 (예: S3 읽기 전용)
- 서버-서버 환경 외 외부에 노출 금지
6. 마무리 요약과 체크리스트
인증 토큰과 보안 토큰은 모두 시스템 보안의 핵심 요소입니다. 그 기능은 명확히 다르지만, 실제 실무에서는 함께 사용되며 잘못 관리하면 심각한 보안 사고로 이어질 수 있습니다.
📌 아래는 실무에 적용할 수 있는 핵심 점검표입니다:
- JWT에 개인정보를 포함하지 않고, httpOnly 쿠키로 전달
- 보안 토큰(STS 등)은 유효 시간 최소화 + 리소스 제한
- RefreshToken은 2차 인증 및 블랙리스트 처리 체계 구축
- 로그 기반 이상 접근 탐지 시스템 연동
- 서버 간 통신 시에는 항상 보안 토큰을 별도로 관리
'Security보안 > 웹어플리케이션 보안' 카테고리의 다른 글
Content Security Policy(CSP)로 자바스크립트 보안 강화하기 (1) | 2025.04.22 |
---|---|
HTTPS와 SSL 인증서, 아직도 헷갈리시나요? (0) | 2025.04.20 |
CI/CD와 보안의 만남, DevSecOps 구축 실전 노하우 (0) | 2025.04.12 |
보안 코드 리뷰 체크리스트 – 실무에 바로 쓰는 취약점 점검 항목 (1) | 2025.04.04 |