Spring Boot에서 JWT 인증 구현하기 (정리)

2025. 5. 6. 20:32·프로젝트/SnapNote
반응형

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
'프로젝트/SnapNote' 카테고리의 다른 글
  • Spring Boot API 테스트 중 401 Unauthorized 에러 해결기
  • Spring Boot 회원가입 및 로그인 구현 + Postman 테스트 기록
  • SnapNote 프로젝트 개발환경 세팅기
  • Mac에서 MySQL 설치 후 SnapNote용 DB 생성하기
시시응
시시응
시시응 블로그
  • 시시응
    시시응응
    시시응
  • 전체
    오늘
    어제
    • 분류 전체보기 (126)
      • KT AIVLE (31)
      • 대외활동 (32)
        • 사회리더 대학생 멘토링 (0)
        • 22 하반기 코드클럽 (7)
        • 23 상반기 코드클럽 (9)
        • 1784 스쿨혁명 (15)
        • 멋쟁이 사자처럼 (1)
      • 프로젝트 (8)
        • 캡스톤 (3)
        • SnapNote (5)
      • study (1)
        • 데이터분석 (1)
      • 코딩테스트 (49)
        • 프로그래머스 (31)
        • 백준 (15)
        • 알고리즘 (2)
        • 자료구조 (1)
      • IT (5)
        • Git (3)
        • 개발환경 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코테
    KT
    codeclub_south_korea
    네이버커넥트재단
    교육봉사
    Lv1
    에이블스쿨
    코드클럽
    프로그래머스
    코드클럽한국위원회
    대외활동
    Python
    1784스쿨혁명
    소프트웨어야놀자
    AIVLE
    코딩테스트
    KT에이블스쿨
    playsw_mentor
    파이썬
    대학생
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
시시응
Spring Boot에서 JWT 인증 구현하기 (정리)
상단으로

티스토리툴바