🌿 중급 백엔드
JWT가 뭔가요?
쉽게 이해하기
JWT는 놀이공원 입장권 같아요. 입장할 때 표를 끊으면 손목에 밴드를 채워주죠. 그 밴드만 있으면 재입장할 때 매번 표를 다시 확인할 필요 없이 바로 들어갈 수 있어요. JWT도 한 번 로그인하면 토큰을 받고, 이후에는 그 토큰만 보여주면 서버가 '아, 이 사람 맞네' 하고 인증해주는 거예요.
핵심 정리
로그인 상태를 유지하기 위해 사용하는 토큰 형식으로, 서버에 저장하지 않고도 인증할 수 있어요.
자세히 알아보기
JWT(JSON Web Token)는 웹에서 가장 많이 쓰이는 토큰 기반 인증 방식이에요. 로그인에 성공하면 서버는 사용자 정보를 담은 JWT를 발급하고, 클라이언트는 이 토큰을 브라우저에 저장해요(주로 localStorage나 쿠키). 이후 API 요청을 보낼 때마다 헤더에 이 토큰을 같이 보내면, 서버는 토큰을 검증해서 누구인지 확인해요.
JWT는 'header.payload.signature' 세 부분으로 나뉘어 있어요. Header는 토큰 타입과 암호화 알고리즘 정보, Payload는 사용자 ID 같은 실제 데이터, Signature는 토큰이 위조되지 않았음을 증명하는 서명이에요. 서버는 비밀키로 서명을 만들고, 누군가 토큰을 조작하면 서명이 안 맞아서 무효 처리돼요.
JWT의 장점은 서버가 세션을 저장할 필요가 없다는 거예요(Stateless). 세션 방식은 서버 메모리나 데이터베이스에 로그인 정보를 저장해야 하는데, JWT는 토큰 자체에 정보가 들어 있어서 서버 부담이 적어요. 마이크로서비스 구조에서 여러 서버가 같은 토큰을 검증할 수 있어서 확장성도 좋고요.
하지만 단점도 있어요. 한 번 발급된 JWT는 중간에 무효화할 수 없어요(만료 시간이 될 때까지). 그래서 비밀번호를 바꿔도 기존 토큰은 여전히 유효하죠. 이 문제를 해결하려고 짧은 만료 시간의 Access Token과 긴 만료 시간의 Refresh Token을 함께 쓰는 방식을 많이 사용해요. 실무에서는 인증 라이브러리(Auth0, Firebase Auth 등)가 JWT를 자동으로 관리해줘서 직접 구현할 일은 적지만, 원리는 알아야 문제를 해결할 수 있어요.