토큰 공격과 보안 강화
인증 흐름을 악용으로부터 방어합니다.
토큰 공격과 보안 강화은(는) CoddyKit의 무료 Cyber Security Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cyber Security Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
토큰은 자격 증명
현대적인 인증에서 토큰은 자격 증명입니다. 유효한 베어러 토큰을 보유한 주체는 토큰이 만료되거나 폐기될 때까지 인증된 당사자로 취급됩니다.
- 따라서 토큰 탈취는 자격 증명 탈취와 같습니다.
- 보안 강화는 토큰 수명 제한, 보유자에 대한 토큰 바인딩, 신속한 폐기 활성화에 초점을 둡니다.
이 강의에서는 OAuth/OIDC/SAML 토큰에 대한 공격과 이에 대응하는 방어 제어를 다룹니다.
JWT 알고리즘 혼동
전형적인 JWT 공격은 alg 헤더를 악용합니다.
- alg: none을 허용하면 공격자가 서명되지 않은 토큰을 위조할 수 있습니다.
- RS256에서 HS256으로의 혼동을 이용하면 공격자가 공개 RSA 키를 HMAC 비밀 키로 사용해 토큰에 다시 서명할 수 있습니다.
방어 방법은 서버 측에서 예상 알고리즘을 고정하고, 토큰이 실행할 검증 경로를 결정하도록 절대 허용하지 않는 것입니다.
Vulnerable: verify(token, key) // alg taken from header
Hardened: verify(token, key, { algorithms: ["RS256"] })
// reject alg:none, reject HS* when RS* expectedXSS와 로그를 통한 토큰 탈취
가장 흔한 토큰 침해는 유효한 토큰을 그대로 훔치는 것입니다.
- XSS는
localStorage나 메모리에서 토큰을 읽습니다. - URL에 포함된 토큰은 브라우저 기록, 리퍼러 헤더, 서버 로그를 통해 유출됩니다.
Authorization헤더를 지나치게 상세하게 기록합니다.
브라우저 세션에는 httpOnly, 보안, SameSite 쿠키를 우선 사용하고, 로그와 URL에서 토큰을 제거하십시오.
Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax
// keeps JS (and thus XSS) from reading the token재생 공격
재생 공격은 캡처한 유효 토큰을 재사용해 피해자 행세를 하는 공격입니다.
- 짧은 만료 시간, 일회성
nonce(OIDC), 어설션 ID 추적으로 완화할 수 있습니다(SAML). - TLS는 수동적인 네트워크 캡처를 방지합니다.
- 발신자 제약 토큰은 도난당하더라도 재사용을 막습니다.
Replay defenses:
short exp + nonce/jti uniqueness
TLS everywhere
sender-constrained tokens (mTLS / DPoP)발신자 제약 토큰
베어러 토큰은 이를 보유한 누구나 사용할 수 있습니다. 발신자 제약 토큰은 토큰을 특정 클라이언트 key에 연결합니다.
- mTLS로 바인딩된 토큰(RFC 8705)은 토큰을 클라이언트 TLS 인증서에 연결합니다.
- DPoP(RFC 9449)는 클라이언트가 요청마다 서명하는 소유 증명 key에 토큰을 연결합니다.
따라서 일치하는 개인 key 없이는 도난당한 토큰을 사용할 수 없습니다.
DPoP: each request carries a signed proof JWT
DPoP: <proof-jwt signed with client private key>
Authorization: DPoP <access_token>짧은 수명과 갱신 토큰 순환
도난당한 토큰이 유효한 시간을 제한하십시오.
- 액세스 토큰을 짧은 수명으로 유지하십시오(분 단위).
- 갱신 토큰 순환을 사용하십시오. 갱신할 때마다 새 갱신 토큰을 발급하고 이전 토큰을 무효화합니다.
- 순환된 갱신 토큰의 재사용을 탈취 신호로 감지하고 전체 체인을 폐기하십시오.
On /token refresh:
issue new RT, invalidate old RT
if old RT presented again -> breach -> revoke family토큰 폐기와 상태 조회
자체 포함형 JWT는 만료 전까지 유효하므로 폐기가 복잡해집니다. 빠르게 액세스를 차단할 방법을 제공하십시오.
- 폐기 엔드포인트(RFC 7009)는 갱신 토큰과 액세스 토큰을 무효화합니다.
- 상태 조회(RFC 7662)를 사용하면 리소스 서버가 토큰 상태를 실시간으로 확인할 수 있습니다.
- 중요한 폐기를 위해
jti기준의 거부 목록을 유지하십시오.
POST /introspect token=...
-> { "active": true, "sub": "...", "scope": "read" }
POST /revoke token=...대상과 범위 적용
유효한 토큰이라고 해서 API에 자동으로 권한이 부여되는 것은 아닙니다. 토큰의 의도를 적용하십시오.
- aud를 확인하여 다른 서비스용으로 발급된 토큰이 사용자 API에서 재생되지 않도록 하십시오.
- 엔드포인트마다 범위를 적용하십시오. 유효한 토큰이라고 해서 전체 액세스 권한이 있다고 가정하지 마십시오.
- iss를 검증하여 신뢰할 수 없는 발급자의 토큰을 차단하십시오.
이렇게 하면 서비스 간 토큰 재사용과 혼동된 대리인 악용을 막을 수 있습니다.
혼동 공격과 제공자 간 공격
클라이언트가 여러 ID 제공자를 지원할 때는 혼동 공격을 통해 한 IdP가 발급한 코드나 토큰을 공격자가 선택한 다른 엔드포인트로 보내도록 속일 수 있습니다.
- 클라이언트는 응답이 어느 AS에서 왔는지 추적하지 못하게 됩니다.
- 방어 방법은
iss매개변수(RFC 9207)를 사용해 응답을 발급자에 연결하고, 제공자별로state를 검증하는 것입니다.
/authorize ... &state=<provider-bound>
callback must include &iss=<expected-AS>
client verifies iss matches the AS it started with안전한 저장과 전송
토큰을 어디에 어떻게 보관하는지가 노출 범위를 결정합니다.
- 브라우저 세션: httpOnly, 보안, SameSite 쿠키를 사용하고
localStorage는 피하십시오. - 모바일: OS 키체인/키스토어를 사용하고 평문 파일은 절대 사용하지 마십시오.
- 서버: 비밀 관리자, 저장 시 암호화, 범위를 제한한 최소 권한을 사용하십시오.
- 전송 중에는 항상 TLS를 사용하고, 쿼리 문자열에 토큰을 넣지 마십시오.
토큰 보안 강화 점검 목록
제어 수단을 하나의 운영 기준선으로 통합하십시오.
- 알고리즘을 고정하고
alg: none과 알고리즘 혼동 공격을 거부하십시오. - iss, aud, exp, 서명, nonce/state를 검증하십시오.
- 짧은 액세스 토큰 TTL과 재사용 감지가 포함된 갱신 토큰 순환을 사용하십시오.
- 가치가 높은 API에는 발신자 제약 토큰(DPoP/mTLS)을 우선 사용하십시오.
- 폐기와 상태 조회를 지원하십시오.
- 안전하게 저장하고 URL과 로그에 토큰을 남기지 마십시오.
Hardening baseline:
[ ] alg pinned, none rejected
[ ] iss/aud/exp/sig/nonce validated
[ ] short TTL + RT rotation + reuse detection
[ ] DPoP/mTLS for sensitive scopes
[ ] revoke + introspect available빠른 확인: 도난당한 토큰 무력화
토큰 자체가 도난당했을 때 피해를 가장 효과적으로 제한하는 제어 수단을 선택하십시오.
복습: 토큰 공격과 보안 강화
핵심 내용:
- 토큰은 자격 증명이므로 토큰 탈취는 계정 탈취와 같습니다.
- 알고리즘을 고정하고 iss, aud, exp, 서명, nonce를 검증하여 JWT를 방어하십시오.
- 짧은 수명과 재사용 감지가 포함된 갱신 토큰 순환으로 노출을 제한하십시오.
- 발신자 제약 토큰(DPoP/mTLS)은 도난당한 베어러 토큰을 무력화합니다.
- 폐기와 상태 조회를 제공하고 토큰이 URL, 로그, localStorage에 남지 않도록 하십시오.
AI 튜터와 함께 Cyber Security Academy을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 76
- 레슨
- 303
자주 묻는 질문
“토큰 공격과 보안 강화” 강의는 무료인가요?
네 — “토큰 공격과 보안 강화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cyber Security Academy 강의 전체를 잠금 해제할 수 있습니다. Cyber Security Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“토큰 공격과 보안 강화”에서 뭘 배우나요?
인증 흐름을 악용으로부터 방어합니다. 브라우저에서 직접 실행하는 실습 코드로 Cyber Security Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cyber Security Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cyber Security Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“토큰 공격과 보안 강화” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cyber Security Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cyber Security Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- OAuth 2.0 흐름
- OpenID Connect (OIDC)
- SAML과 페더레이션
- 토큰 공격과 보안 강화