728x90
이전 글
JWT FILTER
이전 글과 같이 Token을 생성하였다면, Token을 인증해주어야 합니다.
토큰 인증 기능을 만들지 않는다면 Token은 있으나 마나 한 존재가 됩니다.
아무 토큰이나 가지고 있어도 통과가 될 테 니깐요.
아래의 글을 확인하면 아래의 모든 내용이 담겨 있습니다.
JwtFilter 생성
@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter {
private final UserService userService;
private final String secretKey;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// http header에 있는 AUTHORIZATION 정보를 받아옵니다.
final String authorization = request.getHeader(HttpHeaders.AUTHORIZATION);
log.info("authorization : {}", authorization);
// header에 있는 AUTHORIZATION이 없거나, AUTHORIZATION이 "Bearer"로 시작하지 않으면 block처리합니다.
if (authorization == null || !authorization.startsWith("Bearer ")) {
log.info("authorization이 없습니다");
filterChain.doFilter(request, response);
return;
}
// AUTHORIZATION에 있는 Token을 꺼냅니다.
String token = authorization.split(" ")[1];
// Token의 만료 여부를 확인합니다.
if (JwtUtil.isExpired(token, secretKey)) {
log.info("Token이 만료 되었습니다.");
filterChain.doFilter(request, response);
return;
}
String userName = JwtUtil.getUserName(token, secretKey);
log.info("userName = {}", userName);
UsernamePasswordAuthenticationToken authenticationToken =
new UsernamePasswordAuthenticationToken(userName, null, List.of(new SimpleGrantedAuthority("USER")));
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
filterChain.doFilter(request, response);
}
}
JwtUtil 클래스에 메서드 추가
@Slf4j
public class JwtUtil {
// 토큰에 있는 userName을 꺼내오는 메서드
public static String getUserName(String token, String secretKey) {
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)
.getBody().get("userName", String.class);
}
// 만료를 확인하는 메서드
public static boolean isExpired(String token, String secretKey) {
log.info("token = {}", token);
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token)
.getBody().getExpiration().before(new Date());
}
...
}
Spring Security Config에서 addFilterBefore 추가
...
@RequiredArgsConstructor
public class SecurityConfig {
private final UserService userService;
@Value("${jwt.secret}")
private String secretKey;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception{
return httpSecurity.
httpBasic().disable()// http basic이 아닌 token으로 인증할 것 이기 때문에 disable 처리
.c..
.and()
.addFilterBefore(new JwtFilter(userService, secretKey), UsernamePasswordAuthenticationFilter.class)
.build();
}
}
이제 토큰을 가지고 있는 사람이 누구인지 신원 확인이 가능해졌습니다.
A유저가 B유저의 토큰을 가지고 글을 쓰거나 수정하거나 삭제할 수 없습니다.
반응형
'프로젝트 > Archive' 카테고리의 다른 글
[03] 포스트 등록 만들기 (0) | 2022.12.23 |
---|---|
[03] 포스트 기능 만들기 준비 (0) | 2022.12.23 |
[02] 로그인 기능 만들기 - 1 (1) | 2022.12.21 |
[02] 로그인 기능 만들기 - 0 (0) | 2022.12.21 |
[01] 회원가입 기능 만들기 - 1 (0) | 2022.12.21 |