시큐리티(JWT) 모듈 사용 가이드
개요
본 문서에서는 웹사이트에서 사용하는 JWT(Java Web Token) 기반 시큐리티를 사용하기 위한 기능에 대해 설명한다.
인증(Authentication)과 인가(Authorization)에 대한 세부 내용은 세션 기반 캐모마일 시큐리티 문서를 참고한다.
관련 주요 클래스
클래스/컴포넌트명 | 설명 | |
---|---|---|
ChamomileSecurityJwtConfiguration.java | JWT 기반 캐모마일 시큐리티 설정을 관리 | |
AccessTokenFilter.java | 최초 로그인 시 사용자 인증 및 토큰을 발급(access, refresh)하여 DB 또는 캐시에 저장 | |
RefreshTokenFilter.java | RefreshToken을 통해 AccessToken과 RefreshToken을 재발급 | |
JwtFilter.java | API 인증 시 토큰 유효성을 검사하며, 실제 사용자 인증은 프로바이더에게 위임 | |
JwtProvider.java | 사용자 정보와 토큰을 검증해 실제 인증 과정을 처리 | |
JwtTokenUtils.java | Jwt토큰 생성,삭제, 유효성 등 JWT 관련된 전반적인 유틸 | |
JwtAuthentication.java | AccessToken, RefreshToken, Validate 등의 과정을 담당 | |
사용법
chamomile-sample-boot-basic
프로젝트 생성dependency 등록(pom.xml)
<dependency> <groupId>net.lotte.chamomile.module</groupId> <artifactId>chamomile-security-jwt</artifactId> </dependency>yaml 파일 설정(application.yml)
chmm: security: loginProcessingUrl: /security/jwt/authenticate # AeccessToken,RefreshToken 발급 refreshProcessingUrl: /security/jwt/refresh-token # 토큰재발급 defaultPasswordEncoder: sha256 # 패스워드 인코더 passwordEncoderList: sha256,bcrypt rsaPassword: # 패스워드 RSA 복호화 use : true # true: RSA 복호화 사용 # false : 일반 평문 사용(RSA 사용X) privateKey : sampleKey ignorePatterns: ## Security 제외할 URI - /chmm/user/update-password - /swagger-ui/** - /api-docs/** - /swagger-resources/** - /v3/api-docs/** - /chmm/board/image/download/** jwt: secret: 0PtD9jRs2Q7Cgw38E8CNSBfxSf/ib/mAElN05fhAUU0FXsB3S8F3rfaaCSHy+NWQZkhDbs1SJm+cjdKQX4eHGA== access-expired-time: 18000000 #30분 refresh-expired-time: 86400000 #24시간
토큰 발급(로그인 요청)

AccessToken
목적
클라이언트가 API 요청 시 사용된다.
특징
유효 기간이 짧다 (기본 30분).
application.yml
에서 유효 기간 조정 가능.만료 후, RefreshToken을 사용해 재발급 가능하다.
RefreshToken
목적
AccessToken이 만료되었을 때 새로운 AccessToken, RefreshToken을 발급 받기 위해 사용된다.
특징
AccessToken보다 긴 유효 기간을 가진다 (기본 1일).
재발급시 AccessToken, RefreshToken 함께 새로 발급 된다.
발급 절차
입력 받은 ID 와 Password를 전달 받아 비밀번호 및 사용자 정보 검증 후 AccessToken 과 함께 RefreshToken을 발급한다.
/security/jwt/authenticate
로 요청을 보내면 JSON{username: "admin", password: "test"}
를 통해 AccessToken과 RefreshToken을 발급할 수 있다.
토큰 재발급

토큰 재발급
목적 AccessToken이 만료되었을 때 RefreshToekn을 새로운 AccessToken, RefreshToken을 발급받기 위해 사용된다.
특징 RefreshToken을 전달하여 신규 AccessToken, RefreshToken 발급
발급 절차:
/security/jwt/refresh-token
통하여 위에AccessTokenFilter에서 생성한 RefreshToekn을 Request Hearder 에"Authorization": "Bearer YKDuD282j39s8..."
앞의 예시와 같이 Refresh 요청시 AccessToken과 RefreshToken 재발급이 가능하다.
API 인증

인증 매커니즘
기본적인 인증 매커니즘은 Spring Security의 인증 매커니즘을 그대로 사용하며, 아래와 같은 흐름으로 이루어진다.
인증 요청 전달받은 AccessToken을 JwtFilter을 통해 검증하고, 유효한 토큰인 경우 UsernamePasswordAuthenticationToken을 생성한다.
AuthenticationManager 위임 AuthenticationManager에 AuthenticationToken을 전달하여 인증을 위임한다.
Authentication 정보 획득 AuthenticationManager에 등록된 AuthenticationProvider를 통해 Authentication 정보를 획득한다.
RDB를 통한 인증 정보 획득 RDB를 통해 사용자 아이디를 기반으로 Authentication 정보를 획득하고, 사용자가 가진 권한 및 사용자가 속한 그룹의 권한 정보를 획득한다.
사용자 상태 확인 및 인증 수행 사용자의 기본적인 상태(계정 잠김, 비활성화, 만료 등)를 확인하고, 정상적인 경우 패스워드를 검사하여 인증을 수행한다. 그 후, 비밀번호 상태(비밀번호 만료 등)를 확인한다.
인증 성공 후 처리 인증이 성공하면, 원래 요청한 페이지로 redirect 된다.
인증 절차
발급된 AccessToken으로 Request Hearder 에 예제) "Authorization": "Bearer YKDuD282j39s8"
로 API 호출시 인증이 가능하다.
CORS
CORS는 웹 페이지가 다른 도메인의 리소스에 접근할 수 있도록 허용하는 메커니즘 이다.