2024.12.26 - [Spring Boot/이론정리] - JWT를 이용한 자바 보안 시스템 설정
JWT를 이용한 자바 보안 시스템 설정
1. JWT (JSON Web Token) JWT는 인증 정보를 JSON 형식으로 담고, 이를 인코딩한 토큰이다.JWT는 인증서를 대신하는 디지털 신분증 같은 것이다.헤더는 신분증의 표지이고, 페이로드는 신분증 안의 개인
tbghdus.tistory.com
이 그림은 JWT를 이용한 인증 및 보안 처리 과정을 설명한 것이다. JWT가 스프링 부트 환경에서 어떻게 동작하는지, 그리고 우리가 검증해야 하는 부분과 프레임워크가 처리하는 부분을 표현하고 있다.
JWT 토큰의 역할
그림에서 JWT는 '입장권'으로 비유되고 있다. 사용자는 인증을 마치고 나면 토큰을 발급받는데, 이 토큰이 곧 사용자의 신원을 증명하는 역할을 한다.
토큰 검증 과정
'토큰이 유효하지 않은지 체크하는 코드'라는 부분은 우리가 JwtAuthenticationFilter에서 작성한 코드와 같다. 이 과정에서 토큰이 유효한지, 만료되지 않았는지 등을 확인한다. 이는 JWT의 핵심 동작 중 하나이다.
프레임워크와의 연계
그림에서 빨간색으로 표시된 '보안 관련 프레임워크가 처리'라는 부분은 스프링 시큐리티 같은 보안 프레임워크가 인증 과정을 자동으로 처리하는 것을 의미한다. 예를 들어, 우리가 작성한 JWT 검증 코드와 함께 스프링 시큐리티가 역할을 분담한다.
JWT와 서버의 관계
JWT는 클라이언트와 서버 간의 인증을 관리하기 위한 데이터 조각이다. 그림에서는 서버 내부에서 JWT의 검증 및 처리 과정이 간단하게 시각화되어 있다. 이는 서버가 토큰의 유효성을 검증하고, 검증된 토큰에 따라 요청을 처리하는 과정을 나타낸다.
자 그럼 이 내용을 가지고 직접 실습설정을 해보겠다.
config패키지
config를 통해 패스워드 암호회를 설정해준다
보안관련된것이라 SecrityConfig에다가 적어준 것이다.
application.yml 에
jwt :
secret: 숫자와 문자와 기호로 만든 엄청긴 비밀번호
이부분을 자바의 코드로 가져오는 것이다
그리고 이건 절대 회사에서 공개하지 않는다. 해커가 코드의 패턴을 찾아 해킹하기에 이걸 공개하는건 NG 이다
public JwtConfig(@Value("${jwt.secret}") String secretKey) {
this.key = Keys.hmacShaKeyFor(secretKey.getBytes());
}
이부분의 빨간색으로된 $표시로 시작하는게 그 코드이다. jwt의 secreat에 있는 문자열을 가져와 저장하고 암호하해라 라는 뜻이 된것이다.
첫 번째 메서드는 JWT 토큰을 생성하는 역할을 하고,
두 번째 메서드는 JWT 토큰에서 데이터를 추출하는 역할을 한다.
암호화할 함수 암호화된걸 다시 바꾸는 함수 두개가 필요하다는 뜻이다
이를 통해 사용자를 인증하고, 토큰 내부 데이터를 안전하게 활용할 수 있는 구조를 만든 것이다.
첫 번째 메서드: createToken(Long userId)
이 메서드는 사용자 ID를 기반으로 JWT 토큰을 생성하는 역할을 한다.
먼저 현재 시간을 now라는 변수에 담는다.
그리고 이 토큰이 유효할 시간을 계산하여, now에 tokenValidMilisecond만큼 더해 유효기간을 설정한다.
이후 Jwts.builder()를 이용해 JWT를 생성한다. 이 과정에서 토큰 안에 userId를 저장하고, 발행 시간(issuedAt)과 만료 시간(expiration)을 설정한다.
마지막으로 키와 알고리즘을 사용해 서명을 추가함으로써 위변조 방지 기능을 더한다.
이렇게 생성된 JWT 토큰을 문자열 형태로 반환한다.
결과적으로, 이 메서드는 특정 사용자를 위한 고유한 토큰을 만들어내는 기능을 한다.
두 번째 메서드: getTokenClaims(String token)
이 메서드는 생성된 JWT 토큰에서 정보를 추출하는 역할을 한다.
Jwts.parser()를 이용해 토큰을 해석할 준비를 한다.
이후 서명 검증에 사용할 키를 설정하는데, 이때 키를 SecretKey 타입으로 변환하여 사용한다.
parseSignedClaims(token)을 호출해 서명이 유효한 토큰을 파싱하고,
최종적으로 토큰 내부의 데이터를 반환한다.
util패키지
유틸리티 클래스는 공통적이고 반복되는 작업을 재사용 가능하게 만들어 코드의 중복을 줄이고 유지보수를 쉽게 하기 위해 사용한다.
이 코드는 이메일 주소가 올바른 형식인지 검증하는 역할을 하는 EmailValidator 클래스이다.
즉, 클래스는 문자열이 이메일 형식에 부합하는지 확인하는 것이다.
filer패키지
이 코드는 JwtAuthenticationFilter라는 클래스이다. 사용자의 요청이 들어올 때마다 JWT 토큰을 검사해서 인증 여부를 확인하는 역할을 한다.
먼저, 특정 요청(회원가입이나 로그인 요청)은 토큰 검증을 하지 않고 바로 다음 필터로 넘긴다.
그 외 요청에서는 헤더에 있는 Authorization 값을 가져온다. 만약 헤더가 없거나 값이 비어 있거나, Bearer로 시작하지 않으면 인증 실패 상태 코드(401)를 반환한다.
토큰이 유효한지 확인한다.
여기서 토큰의 유효시간이 지나 있으면 역시 401 상태 코드를 반환한다.
토큰이 유효하다면, 토큰에서 사용자 정보를 가져와 인증 객체를 만든다. 이 객체를 SecurityContextHolder에 저장해서 해당 사용자가 인증되었음을 기록한다.
마지막으로, 검증이 끝난 요청은 다음 필터로 넘긴다.
결론적으로, 이 클래스는 JWT 토큰을 검증하고 인증 상태를 관리하는 필터 역할을 한다.
'Spring Boot JDBC > 실습' 카테고리의 다른 글
Java와 AWS S3로 이미지 업로드: DB 연동 및 URL 기반 포스트 관리 실습 (0) | 2025.01.03 |
---|---|
Food리뷰 API 실습 음식점 유저 (1) | 2024.12.30 |
여러 테이블 서버 개발 실습 (0) | 2024.12.23 |
Spring Boot 를 통한 CRUD 실습 (1) | 2024.12.20 |
SpringBoot 와 DB 터널링 과 실습 (0) | 2024.12.19 |