데이터 유출 사고는 기업의 명운을 가르는 치명적인 위협입니다. 특히 모바일 앱과 서버가 통신하는 API 구간은 해커들의 주된 타깃이죠. 단순히 ‘ID와 비밀번호’만으로 사용자를 인증하던 시대는 끝났습니다. 오늘은 현대 웹/앱 보안의 표준인 JWT(JSON Web Token)와 OAuth2 프로토콜을 활용해, 철통 보안 API를 설계하는 엘리트 전략을 공유합니다.

[그림 1] 견고한 데이터 전송을 위한 API 보안 계층의 중요성
1. 세션(Session)의 한계와 무상태(Stateless) 엔진, JWT
전통적인 세션 방식은 서버 메모리에 사용자 정보를 저장해야 했습니다. 사용자가 늘어나면 서버 부하가 심해지고, 서버가 여러 대일 경우 세션 동기화 문제(Session Clustering)가 발생하죠. 이를 해결하는 것이 바로 **JWT**입니다. JWT는 사용자 정보를 암호화하여 토큰 자체에 담고 다니기 때문에 서버가 따로 정보를 저장할 필요가 없는 ‘Stateless’한 구조를 가집니다.

[그림 2] Header, Payload, Signature로 구성된 JWT의 정밀 구조
위 그림처럼 JWT는 세 부분으로 나뉩니다. 특히 **Signature** 부분은 서버만 알고 있는 ‘Secret Key’로 암호화되어 있어, 클라이언트가 데이터를 위변조하는 것을 원천 차단합니다. 하지만 주의할 점은 Payload는 단순히 Base64로 인코딩된 것이라 누구나 열어볼 수 있다는 점입니다. 따라서 **민감한 개인정보(비밀번호 등)를 절대 Payload에 넣어서는 안 됩니다.**
2. OAuth2: 인증(AuthN)이 아닌 인가(AuthZ)의 표준
많은 분이 OAuth2를 소셜 로그인 도구로만 알고 계십니다. 하지만 OAuth2의 본질은 **’제3의 서비스에 나의 권한을 안전하게 위임(Authorization)’**하는 것입니다. 우리 앱이 카카오톡의 친구 목록을 가져오고 싶을 때, 사용자의 카카오 비밀번호를 우리 앱이 알 필요 없이 ‘제한된 접근 권한’만 받는 방식이죠.

[그림 3] 보안성이 가장 높은 Authorization Code Grant 방식의 데이터 흐름
가장 널리 쓰이는 ‘Authorization Code Flow’는 브라우저를 통해 코드를 먼저 받고, 서버 대 서버로 토큰을 교환하는 방식을 취합니다. 이 과정에서 토큰이 중간에 탈취되는 리스크를 최소화할 수 있습니다.
3. 실전 보안: Access Token과 Refresh Token의 황금 비율
[문제 상황]
Access Token의 만료 시간을 길게 잡으면 보안에 취약하고, 짧게 잡으면 사용자가 너무 자주 로그아웃되는 불편함이 생깁니다.
[해결 전략]
저는 30분짜리 수명이 짧은 **Access Token**과 2주일짜리 수명이 긴 **Refresh Token**을 함께 사용하는 전략을 택했습니다. 특히 Refresh Token은 Redis와 같은 서버 측 저장소에 보관하고, 토큰 탈취 의심 시 즉시 무효화(Revoke)할 수 있는 기능을 추가하여 보안과 UX의 균형을 맞췄습니다.
// Spring Boot: JWT 필터에서의 토큰 검증 예시
@Override
protected void doFilterInternal(HttpServletRequest request, ...) {
String token = resolveToken(request);
if (token != null && jwtProvider.validateToken(token)) {
// 토큰이 유효하면 인증 객체 설정
} else {
// 만료 시 Refresh Token 확인 로직 가동
}
}
4. 더 깊은 곳: 암호화 알고리즘과 Key Management
단순히 `HS256`(대칭키)을 쓰는 것보다 `RS256`(비대칭키) 방식을 사용하는 것이 대규모 아키텍처에서는 더 유리합니다. 서버는 개인키로 서명하고, 인증이 필요한 여러 마이크로서비스(MSA)들은 공개키만으로 토큰의 진위 여부를 판단할 수 있기 때문입니다. 또한 AWS KMS 같은 전용 키 관리 서비스를 활용해 Secret Key 자체를 격리 보관하는 것이 엘리트 보안의 종착역입니다.
마치며: 보안은 99점이 아니라 0점 아니면 100점입니다
아무리 훌륭한 기능을 가진 앱이라도 보안이 뚫리는 순간 모든 신뢰를 잃습니다. 개발 편리함과 보안성 사이에서 타협하지 마세요. 오늘 제가 공유한 JWT와 OAuth2의 원리를 완벽히 이해하고 시스템에 녹여낸다면, 당신의 서비스는 그 어떤 공격에도 끄떡없는 요새가 될 것입니다.