아주아주 간단하게, 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 에 값 담아서 호출.
'프로그래밍 > Java' 카테고리의 다른 글
Call By Referance / Call By Value (0) | 2022.05.05 |
---|---|
Mutable Object / Immutable Object(부제. String vs Stringbuffer/StringBuilder ) (0) | 2022.05.05 |
접근제어자 정리 (0) | 2022.05.05 |
Java 특징 및 장점 (0) | 2022.05.05 |
JAVA encoding 예제 (0) | 2022.05.05 |