본문 바로가기

Spring Boot/유저 관리 기능

Authorization 헤더, 토큰 기반 인증 : JWT의 이해

JWT(Json Web Token) : https://www.jwt.io/

 

- JWT의 기본 개념

- JWT의 구조(헤더, 페이로드, 시그니처)

- JWT가 생성되고 검증되는 과정

- JWT를 안전하게 관리하는 방법, 보안 고려사항

- 실무에서 JWT를 어덯게 활용하는가


JWT(JSON Web Token)

JWT는 데이터를 안전하고 간결하게 전송하기 위해 고안된 인터넷 표준 인증 방식

특히, 토큰 기반 인증(Token-Based Authentication)에서 가장 범용적으로 사용된다

  • JSON 포맷으로 사용자 정보를 담음
  • 담긴 정보를 Base64URL로 인코딩함
  • Secret Key와 알고리즘을 이용해서 서명(Signature)을 추가하여 위변조를 방지하고 끝

 

1. JWT와 일상속 토큰

JWT는 출입 카드와 비슷한 개념으로, 특정 권한을 가진 사용자가 시스템을 이용할 수 있게 해줌

"나는 정당한 권리를 가진 사용자니까 이 권한으로 무엇무엇을 할게"


JWT의 구조

JWT는 세 부분으로 나뉘며, 각각은 점으로 구분된다.

JWT

  • Header : 어떤 알고리즘으로 서명했는지, 어떤 타입의 토큰인지 정의함
  • Payload : 사용자 정보와 클레임(Claim) 데이터가 담김
  • Signature : 헤더와 페이로드가 변조되지 않았음을 검증

 

1. Header

{
  "alg": "HS256", # 사용할 서명 알고리즘(예: HMAC SHA256)
  "typ": "JWT" # 토큰 타입(JWT)
  }

 

이러한 형태의 JSON 객체를 Base64URL로 인코딩하면 JWT의 첫번째 부분이 된다

 

 

2. Payload

{
  "sub": "user123", 
  "name": "B1uffer", 
  "iat": 1516239022
}

 

- 사용자의 고유 정보와 권한, 토큰 발급 시간(jat) 등이 포함됨

- 민감한 정보를 직접 담아서는 안된다

- Base64URL로 인코딩하면 두번째 부분이 된다.

 

 

3. Signature

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

 

- 서버의 비밀 키(Secret Key)로 생성된다

- 클라이언트가 보낸 토큰이 변조되지 않았음을 검증한다

 


JWT의 동작 흐름

JWT의 동작 흐름


Access Token과 Refresh Token

JWT는 보통 두가지 종류의 토큰과 함께 사용된다

구분 Access Token Refresh Token
목적 API 요청시 인증/인가 Access Token 재발급
유효기간 짧음(분~시간 단위) 김(일~주 단위)
보관 위치 보통 메모리/스토리지 안전하게 보관 필요

 

Access Token만 있으면 권한 요청은 가능하지만, 탈취될 경우 큰 피해가 발생할 수 있으므로 반드시 짧은 만료기간을 설정해야함


JWT 사용 예시

앱 A가 Gmail과 연동되어 이메일을 읽어와야 하는 경우,

  1. 사용자가 Gmail 인증서버에 로그인함(ID, PW 제출)
  2. 인증에 성공하면 서버는 JWT를 발급해줌
  3. 앱 A는 이 JWT를 Authorization 헤더에 넣어서 Gmail API를 요청함
  4. Gmail 서버는 JWT의 서명을 검증 후 이메일 데이터를 반환해줌

이러한 과정을 통해 사용자는 Gmail 비밀번호를 앱 A에 직접 제공하지 않아도 안전하게 데이터를 연동할 수 있음


JWT는 편리하지만, 잘못 사용하면 보안에 취약해질 수 있다.

 

1. 민감한 정보 포함 금지

 - JWT는 Base64URL로 인코딩되어 있을 뿐, 암호화되진 않는다

 - 따라서 토큰 안에 비밀번호, 주민등록번호 같은 민감한 정보를 절대 넣지 말아야함

 

2. 토큰 만료기간 설정

 - 토큰은 만료기간(exp)를 반드시 설정해야한다

 - 만료기간이 없는 토큰은 탈취될 경우, 영구적으로 악용될 수 있다

 

3. HTTPS 사용

 - JWT는 네트워크를 통해 전달되므로 반드시 HTTPS를 통해 암호화된 채널에서만 전송해야한다

 

4. 저장 위치 주의

 - 로컬 스토리지(Local Storage) 대신 HTTPOnly 쿠키 또는 보안이 강화된 세션 스토리지 사용을 권장한다고 함.

 - 로컬 스토리지는 XSS 공격에 취약하다고 한다.

 

5. 토큰 무효화 전략

 - 기본적으로 JWT는 발급 후 만료 전까지 무효화할 수 없다.

 - 이를 보완하기 위해 서버 측에서 블랙리스트를 관리하거나 Redis같은 인메모리 DB를 활용할 수 있다.


 - Access Token은 짧은 만료 시간을 설정해 보안성을 높인다

 - 중요한 API 요청에는 추가적인 인증(IP제한, MFA 등등..)을 적용한다.

 - 로그아웃시에는 토큰을 무효화할 수 있도록 서버 측 블랙리스트를 활용하는게 좋다.

 - JWT는 서버 확장성이 중요한 마이크로서비스 아키텍처에서 특히 유용하다고 함.


정리

항목 설명
JWT  JSON 데이터를 인코딩 + 서명하여 인증에 사용하는 토큰
구조 Header, Payload, Signature 세 부분으로 구성
장점 서버 확장성에 유리함, 세션 불일치 문제가 없음
단점 토큰 무효화가 어려움, 탈취시 보안이 위험함
사용 예시 OAuth, API 인증, 마이크로서비스간 통신 등