아주아주 간단하게, Spring 에 로그인을 위한 JWT 토큰 발급 방법.

 

1. pom.xml에 jjwt dependency 등록

<dependency>
  <groupId>io.jsonwebtoken</groupId>
  <artifactId>jjwt</artifactId>
  <version>0.9.0</version>
</dependency>
 

2. servlet-context 에 (혹은 본인 프로젝트의 설정 xml 파일에) 설정 작성.

<beans:bean id="jwtInterceptor" class="인터셉터 만들 곳 경로"></beans:bean>
	
	<mvc:interceptors> 
		<mvc:interceptor> 
			<mvc:mapping path="/**"/>
			<mvc:exclude-mapping path="/api/Users/**"/> 
			<beans:ref bean="jwtInterceptor"/> 
		</mvc:interceptor> 
	</mvc:interceptors>
 

mvc:mapping path : 기본적으로 jwt 인터셉터 적용할 api path 설정.

mvc:exclude-mapping path : jwt 인터셉터 적용 제외할 api path 설정.

 

3. Interceptor 클래스 생성

@Component
public class JwtInterceptor implements HandlerInterceptor{
	
	private static final String HEADER_AUTH = "Authorization";
	
	@Autowired
	private IJwtService jwtService;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		final String token = request.getHeader(HEADER_AUTH);

		if(token != null && jwtService.isUsable(token)){
			return true;
		}else{
			System.out.println(request.getContextPath());
			response.sendError(401,"Authorized Error!!");
			return false;
		}
	}
}
 

preHandle -> HandlerInterceptor implements -> preHandle 상속 받아서 구현.

* preHandle 는 호출 시, 맨 처음 가져가서 컨트롤 하는 부분

 

4. JwtService 구현

@Service("jwtService")
public class JwtServiceImpl implements IJwtService{
	
	private static final String SALT =  "sunkakaocode";
	
	@Override
	public <T> String createToken(String key, T data, String subject){
		String jwt = Jwts.builder()
						 .setHeaderParam("typ", "JWT")
						 .setHeaderParam("regDate", System.currentTimeMillis())
						 .setSubject(subject)
						 .claim(key, data)
						 .signWith(SignatureAlgorithm.HS256, this.generateKey())
						 .compact();
		return jwt;
	}	

	private byte[] generateKey(){
		byte[] key = null;
		try {
			key = SALT.getBytes("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return key;
	}
	
	@Override
	public boolean isUsable(String jwt) {
		boolean isUsable = false;
		try{
			Jws<Claims> claims = Jwts.parser()
					  .setSigningKey(this.generateKey())
					  .parseClaimsJws(jwt);
			isUsable = true;
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		return isUsable;
	}
}
 

5. WebConfig 작성

@Configuration
public class WebConfig implements WebMvcConfigurer{

	private static final String[] EXCLUDE_PATHS = {
	};

	@Autowired
	private JwtInterceptor jwtInterceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns(EXCLUDE_PATHS);
	}

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
        		.allowedMethods("GET", "POST", "PUT", "DELETE");
    }
}
 

 

실제 사용은 로그인 시 createToken 생성해서 key를 api 의 response에 담아서 전달 / 혹은 Postman으로 호출 시 header 에 값 담아서 호출.

 

 

 

+ Recent posts