반응형
Spring Boot 프로젝트에서 JWT(Json Web Token)를 사용한 인증 기능을 어떻게 구현했는지 정리한 내용
✅ 왜 JWT가 필요한가?
🔒 기존 로그인 방식의 한계
- 로그인은 성공했지만, 이후 요청들에서 사용자 정보를 알 수 없음
- 매번 이메일/비밀번호를 보내는 것은 비효율적이고 보안상 위험
🛡 JWT 도입 이유
- 로그인에 성공한 사용자에게 서명된 토큰(JWT) 을 발급하고,
- 이후 요청 시 토큰을 헤더에 포함시켜 사용자 인증이 가능하도록 함
📦 구현 개요
항목 | 내용 |
---|---|
발급 시점 | 로그인 성공 시 서버가 JWT 발급 |
사용 방식 | 클라이언트가 요청 헤더에 토큰 포함 (Authorization: Bearer {token} ) |
인증 방식 | 커스텀 JWT 필터로 토큰 검증 후 SecurityContext에 사용자 등록 |
🛠 1. JwtProvider 클래스 구현
- JWT 생성 및 검증을 담당하는 컴포넌트
- 비밀 키(
secret
)와 만료 시간(expiration
)은 application.yml에 설정
jwt:
secret: my-very-safe-secret-key-... (openssl rand -base64 64로 생성)
expiration: 86400000 # 1일
public String generateToken(String email) {
Date now = new Date();
Date expiry = new Date(now.getTime() + expiration);
return Jwts.builder()
.setSubject(email)
.setIssuedAt(now)
.setExpiration(expiry)
.signWith(key, SignatureAlgorithm.HS256)
.compact();
}
🔐 2. JwtAuthenticationFilter 구현
- 모든 요청에 대해 헤더에서 토큰을 추출하고, 유효한 경우 인증 정보를 설정
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(email, null, Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(authentication);
- 이때
Collections.emptyList()
를 권한으로 추가하지 않으면 403 오류가 발생할 수 있음
⚙ 3. SecurityConfig 설정
- JWT 필터를 Spring Security의 인증 필터 체인에 등록
.addFilterBefore(new JwtAuthenticationFilter(jwtProvider),
UsernamePasswordAuthenticationFilter.class)
- 인증이 필요 없는 경로는 permitAll로 예외 처리
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/signup", "/api/login").permitAll()
.anyRequest().authenticated())
🧪 4. Postman 테스트
1. 로그인 후 토큰 발급
- POST
/api/login
- 응답 JSON:
{ "token": "eyJhbGciOiJIUzI1NiIsInR..." }
2. 보호된 API 요청
- GET
/api/memos
(혹은 임의의 보호된 엔드포인트) - 헤더에
Authorization: Bearer {token}
포함 - 정상적으로 작동하면 200 OK / 인증 실패 시 403
✅ 마무리
이번 구현을 통해 다음을 확인했다:
- JWT 토큰 발급과 유효성 검증이 정상적으로 작동
- SecurityContextHolder에 인증 객체가 설정됨
- Postman으로 인증 테스트 성공
이제 이후에는 인증된 사용자 기반 기능 (메모 저장, 마이페이지 등)을 구현하면서 SecurityContext에서 사용자 정보를 꺼내 쓰게 된다.
반응형
'프로젝트 > SnapNote' 카테고리의 다른 글
Spring Boot API 테스트 중 401 Unauthorized 에러 해결기 (0) | 2025.05.06 |
---|---|
Spring Boot 회원가입 및 로그인 구현 + Postman 테스트 기록 (0) | 2025.05.06 |
SnapNote 프로젝트 개발환경 세팅기 (0) | 2025.04.26 |
Mac에서 MySQL 설치 후 SnapNote용 DB 생성하기 (0) | 2025.04.26 |