코딩한걸음
article thumbnail
728x90
반응형

Q. JWT에 대해서 설명하시오


JWT는 JSON Web Token의 약자로 JSON을 이용해 정보를 안전하게 다루기 위한 개방형 표준입니다.
JWT는 크게 헤더(Header), 내용(Payload), 서명(Signature)으로 나뉘어지며 `.`으로 각 부분을 구분합니다.
각 부분은 전부 Base64 URL-safe Encode로 인코딩되어 사용됩니다.

JWT는 자체적으로 필요한 정보를 담고 있어서, 인증 정보를 매 요청마다 서버에 저장할 필요가 없어서 상태를 유지하지 않는(stateless) RESTful API에 적합합니다. 또한, 여러 다른 플랫폼과 도메인 간에도 사용할 수 있어 확장성이 높습니다.

하지만 보안 측면에서는 몇 가지 주의할 점이 있습니다. 암호화되지 않은 JWT는 Payload의 내용이 누구나 읽을 수 있기 때문에 민감한 정보는 포함되어서는 안됩니다. 또한, 서명을 위한 비밀 키 관리가 중요한데, 이 키가 노출될 경우 토큰의 신뢰성이 훼손될 수 있습니다.

 

답변 키워드

JSON 설명, 구조, 확장성, 보안 + 사용 경험

 

JSON (JavaScript Object Notation)

  • 데이터를 저장하고 전송하기 위한 경량 형식
  • 서버에서 웹페이지로 데이터를 보낼 때 자주 사용된다.
  • "자기설명적(self-describing)"이고 이해하기 쉽다.

 

JSON 구문 규칙

  • 데이터가 name / value 쌍으로 되어 있음
  • 데이터는 쉼표로 구분
  • 객체는 중괄호 안에 작성
  • 배열은 대괄호 안에 작성, 배열에는 객체가 포함될 수 있음

 

JSON 예

{
"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]
}

출처 : https://www.w3schools.com/whatis/whatis_json.asp

 

JWT 구조

  • 헤더 (Header) : 토큰 유형, 해싱 알고리즘으로 구성
  • 내용 (Payload) : 클레임(claims)이라고 하는 명세된 정보 세트를 포함
  • 서명 (Signature) : 헤더, 페이로드의 인코딩 값, 비밀키, 헤더에서 지정한 알고리즘을 사용하여 생성

 

클레임 (Claims)

  • 등록된 클레임 (Registered claims) : 미리 정의된 클레임
  • 공개 클레임 (Public claims) : 사용자가 정의할 수 있는 클레임
  • 비공개 클레임 (Private claims) : 두 개체 사이에 합의된 클레임

 

JWT 장단점

장점

  • 자가 수용적 : JWT는 필요한 모든 정보를 자체적으로 포함하므로 별도의 인증 저장소가 필요하지 않다.
  • 높은 확장성 : 서버와 클라이언트 사이에 작은 크기의 토큰을 전송함으로써, 교체 도메인 요청이 용이하다.
  • 사용 편의성 : 모바일 어플리케이션과 같은 다양한 플랫폼 및 도메인에서 사용하기 적합하다.

단점

  • 데이터 기밀성 : 인코딩만 되어 있고 암호화되지 않아 중요한 정보나 민감한 데이터를 내용에 포함시키지 않는것이 좋다.
  • 크기 : 많은 데이터를 포함하면 토큰의 크기가 커져 네트워크 부하를 야기할 수 있다.
  • 토큰 유출 : 중간에 만료되지 않는 한 계속 사용할 수 있다는 점에서 문제가 될 수 있다.
  • 토큰 만료 : JWT가 오랜 시간 동안 유효하다면 보안문제가 될 수 있고, 짧은 시간동안만 유효하다면 사용자는 자주 재인증해야할 수 있다.

 

예상 꼬리 질문

  • JWT이 탈취되었을 때 어떤 보안 위험이 있으며, 이를 어떻게 방지할 수 있나요?
  • JWT의 만료 시간을 어떻게 결정하며, 이 만료 시간을 너무 짧게하거나 길게 설정할 때 발생할 수 있는 문제는 무엇인가요?
  • JWT가 만료된 후에 사용자의 세션을 어떻게 처리할 것인가요?
  • JWT와 함께 refresh token을 사용하는 이유는 무엇이며, 이를 어떻게 관리해야 하나요?
728x90
반응형
profile

코딩한걸음

@Joonyeol_Yoon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!