인증(Authentication) :
"너 누구니?"
인가(Authorization) :
"너 이거 해도 되니?"
현재 나의 프로젝트 구조는
➡️ 프론트 + API 구조에 최적
JWT = "서버가 서명한 사용자 정보 묶음"
구조
HEADER.PAYLOAD.SIGNATURE
{
"userId": 1,
"email": "test@test.com",
"role": "USER",
"exp": 1712345678
}
➡️ DB 조회 안 해도 최소한의 사용자 정보 확인 가능
내가 가지고 있는 로그인 흐름
User user = userService.login(email, password);
⬇️ 여기서 JWT를 발급한다.
String token = jwtProvider.createToken(user.getId(), user.getEmail());
and 응답
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
➡️ 이게 로그인 성공의 결과물
로그인 성공 시
localStorage.setItem("token", token);
API 요청마다 헤더에 첨부
fetch("/api/drink", {
headers: {
Authorization: `Bearer ${token}`
}
});
➡️ 이 한 줄이 인증의 전부
매 요청마다 서버는 이렇게 생각함.
1. Authorization 헤더 있나?
2. JWT 유효한가?
3. 서명 맞나?
4. 만료 안 됐나?
5. userId 추출
여기서부터 권한 개념이 들어온다.
예시 :
JWT payload에 role을 넣어준다.
{
"userId": 1,
"role": "USER"
}
그리고 코드에서 :
if (!userId.equals(drink.getUserId())) {
throw new ForbiddenException();
}
➡️인증 = 너 누구냐
➡️인가 = 너 이거 해도 되냐
➡️JWT = 서버가 서명한 신분증
➡️프론트는 JWT 들고 다님
➡️서버는 JWT만 검증
➡️DB 조회 없이 사용자 식별 가능