강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

최성준님의 프로필 이미지
최성준

작성한 질문수

한 입 크기로 잘라먹는 실전 프로젝트 - SNS 편

(6.1) 인증과 인가 이해하기

실무에서의 JWT에 대해서 질문드려요

해결된 질문

작성

·

92

0

JWT가 이론적으로는 DB에 액세스하는 과정없이 인증이 가능하다고는 하지만,, jwt.io같은데서 payload의 조회를 쉽게 할 수 있기도 하다보니 웬만한 개인정보를 넣는 것은 지양하는 걸로 알고 있습니다.

 

실무에서는 사실상 payload에 userId정도만 넣어두고, 서버에서 이 JWT를 받아 디코딩하여 받은 userId로 DB에 액세스하여 유저정보를 가져와서 유효한 유저인지 파악한 다음 클라이언트에 응답하는 것이 일반적인 케이스가 아닌가.. 그러면 세션과 큰차이가 사실상 없는 것이 아닌가 궁금하여 질문드립니다!

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 최성준님 이정환입니다.

우선 JWT의 payload는 누구나 쉽게 읽을 수 있기 때문에 여기에 민감한 정보를 포함해서는 안 됩니다. jwt.io에서 확인할 수 있듯이 payload는 단순히 Base64URL로 인코딩된 문자열이며, 암호화된 상태가 아니기 때문입니다. 따라서 실무에서는 일반적으로 userId와 같은 식별자 정도만 포함하고, 실제 유저 상태나 상세 정보는 서버에서 다시 조회하는 방식이 널리 사용됩니다.

여기서 자연스럽게 “그렇다면 DB 없는 인증이라는 JWT의 장점이 사실상 없어지는 것 아닌가?”라는 질문이 생길 수 있고, 이는 “결국 세션 방식과 큰 차이가 없지 않은가?”라는 의문으로 이어집니다. 이론적으로는 클라이언트가 JWT를 보내면 서버가 서명과 만료 시간을 검증한 뒤 payload에 담긴 정보만으로도 인증을 처리할 수 있습니다. 이 방식만 놓고 보면 데이터베이스를 거치지 않는 완전한 stateless 인증이 가능해 보이지만, 실제 서비스에서는 다양한 이유로 다시 DB를 조회하는 경우가 많습니다.

대표적인 이유는 토큰 발급 이후에도 사용자의 상태가 계속 변할 수 있기 때문입니다. 사용자가 탈퇴하거나 정지되거나 권한이 변경되는 순간 JWT의 정보는 더 이상 최신 상태를 반영하지 않게 되고, 이때 DB 조회 없이 토큰만 신뢰해버리면 보안적인 문제가 생길 수 있습니다. 또한 비밀번호 변경이나 강제 로그아웃처럼 “세션을 바로 무효화해야 하는 상황”에서는 순수한 JWT만으로는 처리가 어렵기 때문에, 별도의 블랙리스트나 토큰 버전 관리 같은 장치를 두게 되고 그 과정에서 결국 DB를 조회하게 됩니다. 여기에 더해 대부분의 비즈니스 로직은 사용자 정보를 필요로 하기 때문에, 인증이 끝났더라도 실제 작업 수행을 위해 DB 조회가 필수적인 경우가 많습니다.

이런 이유로 payload에 userId 정도만 넣고, 요청이 들어올 때마다 해당 userId로 DB에서 유저 정보를 다시 조회하는 패턴은 실무에서는 매우 일반적이며 안전한 접근입니다. 그렇다고 해서 이 방식이 세션 방식과 동일하다고 보기는 어렵습니다. 세션 인증은 서버가 직접 유저 상태를 세션 저장소에 보관하고 클라이언트는 세션 아이디만 들고 다니므로, 본질적으로 서버가 상태를 유지하는 stateful 구조입니다. 반면 JWT는 유저 상태의 스냅샷을 토큰에 담아 클라이언트로 돌려주는 구조이기 때문에, 서버는 토큰을 검증하는 것만으로도 최소한의 신뢰를 확보할 수 있고 별도의 세션 저장소를 유지할 필요가 없습니다. 이런 점에서 서버 확장성과 분산 처리에서 JWT가 가지는 구조적 장점은 여전히 유효합니다.

결론적으로 실무에서는 JWT를 사용하더라도 DB 조회를 함께 사용하는 경우가 매우 흔합니다. 이는 JWT 방식이 가진 한계를 의미하는 것이 아니라, 현실적인 서비스 요구사항을 반영한 설계 방식이라고 이해하시면 좋겠습니다. Payload에는 최소한의 정보만 유지하고, 나머지는 서버 쪽에서 최신 상태를 기준으로 판단하는 방식이 가장 안전하고 실용적인 접근입니다.

0

안녕하세요, 인프런 AI 인턴입니다. 최성준님.

JWT(JSON Web Token)는 주로 서버와 클라이언트 간의 인증 용도로 많이 사용됩니다. JWT를 사용할 때의 장점 중 하나로는, 서버 측에서 세션을 유지하지 않더라도 클라이언트가 제공하는 토큰을 통해 인증 상태를 확인할 수 있다는 것입니다. 그러나, JWT의 payload 부분은 누구나 디코딩이 가능하기 때문에 민감한 정보를 포함하지 않는 것이 중요합니다.

실무에서의 JWT 사용 방식

  1. 유효성 검사: 보통 JWT는 클라이언트 측에서 발급받은 후, 서버로의 요청 시 Authorization 헤더에 담겨 전송됩니다. 서버에서는 해당 JWT의 서명을 검증해 유효성을 확인합니다.

  2. payload의 정보: 일반적으로 payload에는 userId 또는 기타 특정 ID와 같은 식별자를 저장합니다. 사용자 이메일, 비밀번호 같은 민감한 개인정보는 넣지 않습니다. 이를 통해 서버는 userId를 이용하여 데이터베이스에서 추가 사용자 정보를 조회할 수 있습니다.

  3. 데이터베이스 조회: 서버는 JWT의 userId를 사용해 데이터베이스를 조회하고, 사용자 정보를 가져올 수 있습니다. 이를 통해 인증된 사용자인지 확인합니다. 이것은 적은 개인정보만을 일시적으로 저장하고, 필요한 경우 데이터베이스에서 필요한 정보를 조회하는 방식을 취합니다.

세션과의 차이점

  • 세션 기반 인증: 서버에 사용자의 상태를 저장하며, 클라이언트는 세션 ID를 통해 인증을 유지합니다. 서버가 사용자의 상태 정보를 관리해야 하기 때문에 서버 측 리소스를 사용합니다.

  • JWT 기반 인증: 서버는 클라이언트에게만 토큰의 유효성을 확인하고, 별도의 세션 저장소가 필요 없습니다. 이를 통해 서버의 부담이 줄어들고, 특히 멀티 서버 환경에서 유리하게 동작할 수 있습니다.

다만, JWT는 인증 정보를 담고 있기 때문에 만료 시간 설정 등 관리가 중요합니다. 만료된 토큰을 걸러내고, 사용자가 로그아웃할 경우 토큰을 블랙리스트에 등록하여 관리하는 방식도 같이 사용됩니다.

관련 정보는 다음 게시글을 통해 더 알아보실 수 있습니다:
- React로 로그인 부분 처리하는데 질문이 있습니다.
- useReducer 상태관리 질문있습니다 ㅠㅠ

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최성준님의 프로필 이미지
최성준

작성한 질문수

질문하기