JWT

sun·5일 전

2026

목록 보기
4/6

인증(Authentication) :
"너 누구니?"

인가(Authorization) :
"너 이거 해도 되니?"

JWT 왜 필요한지

현재 나의 프로젝트 구조는

  • 프론트 : React
  • 백엔드 : Spring Boot
  • API : REST 방식

JWT 없을 때 문제

  • 서버가 " 누가 요청했는지" 기억 못한다.
  • 매 요청마다 로그인 필요
  • 세션 쓰면 서버가 상태를 가져야 한다. (확장성 떨어짐)

JWT 쓰면

  • 서버가 상태를 안 가짐 (Stateless)
  • 요청 하나하나에 "내 신분증(JWT)" 들고 옴.
  • 서버는 검증만 하면 됨.

➡️ 프론트 + API 구조에 최적

JWT의 정체를 한 문장으로

JWT = "서버가 서명한 사용자 정보 묶음"
구조

HEADER.PAYLOAD.SIGNATURE

PAYLOAD에 보통 무엇을 넣는가?

{
  "userId": 1,
  "email": "test@test.com",
  "role": "USER",
  "exp": 1712345678
}

➡️ DB 조회 안 해도 최소한의 사용자 정보 확인 가능

인증(Authentication) - 로그인에서 JWT 발급

내가 가지고 있는 로그인 흐름

User user = userService.login(email, password);

⬇️ 여기서 JWT를 발급한다.

String token = jwtProvider.createToken(user.getId(), user.getEmail());

and 응답

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

➡️ 이게 로그인 성공의 결과물


프론트에서 JWT 쓰는 방식

로그인 성공 시

localStorage.setItem("token", token);

API 요청마다 헤더에 첨부

fetch("/api/drink", {
  headers: {
    Authorization: `Bearer ${token}`
  }
});

➡️ 이 한 줄이 인증의 전부

백엔드에서 인증 처리 흐름

매 요청마다 서버는 이렇게 생각함.

1. Authorization 헤더 있나?
2. JWT 유효한가?
3. 서명 맞나?
4. 만료 안 됐나?
5. userId 추출
  • 성공하면 :
    " 아 , 이 요청은 userId=1이 보냈구나"
  • 실패하면 :
    "401 Unauthorized"

인가(Authorization) : "이 사람이 이걸 해도 되니?"

여기서부터 권한 개념이 들어온다.

예시 :

  • User -> 자기 Drink만 CRUD 가능
  • ADMIN -> 전체 조회 가능

JWT payload에 role을 넣어준다.

{
  "userId": 1,
  "role": "USER"
}

그리고 코드에서 :

if (!userId.equals(drink.getUserId())) {
    throw new ForbiddenException();
}

➡️인증 = 너 누구냐
➡️인가 = 너 이거 해도 되냐
➡️JWT = 서버가 서명한 신분증
➡️프론트는 JWT 들고 다님
➡️서버는 JWT만 검증
➡️DB 조회 없이 사용자 식별 가능

0개의 댓글