오늘은 Oauth 통한 JWT 발급 그리고 Interceptor 구현하는 것 까지 MJ로부터 1:1 가르침을 받았어요. MJ에게 정말 감사하다는 말씀을 드립니다🙏
배운 것을 간략하게 정리하자면 이렇습니다.
org.springframework.http.*
에서 제공하는 RequestEntity 클래스를 이용할 수 있어요. RequestEntity는 빌드 패턴 형식으로 요청 보낼 것을 객체에 담을 수 있어요. 코드로 표현하면 다음과 같을 것입니다.
RequestEntity<Void> request = RequestEntity
.get(oauthUtil.getUserinfoUri())
.header("Accept", "application/json")
.header("Authorization", "token " + responseDto.getBody().getAccessToken())
.build();
일단 get()
으로 URL을 만들고요. 그 다음에 .header()
에 원하는 값을 설정할 수 있어요. 아마 .body()
로 body에 원하는 값을 넣을 수 있을거 같아요.
그 데이터를 객체에 저장해주기 위해서 아래처럼 User도 만들어주고요.
public class User {
private Long id;
private String name;
private String avatar_url;
// getter
}
request를 만들었으면 RestTemplate을 이용해서 데이터를 가져올 수 있어요.
ResponseEntity<User> user = restTemplate.exchange(request, User.class);;
JWT 발급을 위해서 JWT 라이브러리를 먼저 가져와주고요.
// Gradle
implementation 'com.auth0:java-jwt:3.15.0'
JWT 발급을 위한 알고리즘을 생성해줍니다.
Algorithm algorithm = Algorithm.HMAC256(oauthUtil.getAlgorithmSecret());
왜 알고리즘을 생성해줄까요? 그건
그리고 JWT를 실제로 내부적으로 생성하는 로직은 다음과 같습니다.
String jwt = JWT.create()
.withClaim("id", user.getBody().getId())
.withClaim("name", user.getBody().getLogin())
.withClaim("avatar_url", user.getBody().getAvatar_url())
.withIssuer(oauthUtil.getIssuer())
.sign(algorithm);
인터셉터는 맨앞단에서 들어오는 모든 트래픽을 먼저 처리해줘요.
어떤 형식으로 구현되는지 아직은 잘 모르겠어요. 어쨋든
먼저 preHandle
을 다음과 같은 클래스에서 HandlerInterceptor
을 상속받고 오버라이드해줍니다.
public class OauthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String jwt = request.getHeader("Authorization");
return true;
}
}
그러면 들어오는 request의 Header 속성 중 Authorization의 값을 가지고 올 수 있어요.
그런데 이 클래스를 이용하기 위해서는 Configuration이 필요해요. 다음과 같이요.
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OauthInterceptor())
.addPathPatterns("/api/**");
// .excludePathPatterns("/api/login/**")
// .excludePathPatterns("/api/accommodations/**");
}
}
addPathPatterns
는 "/api/**"
에 대한 모든 API들을 Intercept한다는 뜻이고, excludePathPatterns
는 뭔지 말안해도 감이 오죠?
https://github.com/kyu-kim-kr/issue-tracker/pull/20/commits/4f7c1b3e5ce0940d11d3b2b7b38da7040c6f105d
호눅신과의 면담
- 자바, 스프링, 디비, 네트워크 현재 내 지식수준은 취업을 하기에 충분한 것 같다 -> X
- 하나라도 공부했다는 완결된 컨텐츠가 필요하다.
- 예를들면, 자바면 자바의정석 완독, 디비면 SQL 첫걸음 완독, 네트워크면 김영한님 HTTP 네트워크 등
- 난 취업 눈이 낮으니까 SI업체도 괜찮을거 같고 아니면 사람인에서 찾아보는 걸 추천. 조인스타트업이나 여러경로로 도움을 요청.
처음 코쿼 시작하기전에 목표는 취업이었는데 구체적인 계획없이 매일 열심히하자 정도여서 아무것도 느끼지 못하고 있었는데 취업하기 전에 필요한 지식들을 셀프체크 해보니 스스로 전부 너무나 부족하다는 것을 와닿아버렸습니다.
특별히 기억나는 호눅스가 조언 해주신 것은 하나라도 공부했다는 완결된 컨텐츠가 필요하다는 것! 맞는거 같아요. 이제 한국에 가면 공부방향을 좀 틀어야겠습니다.
근데 호눅스가 저한테 나이를 물어보시고 제가 대답했는데 "음 개발자니까 그정도면 나이는 괜찮아요" 라고 말씀하셨는데, "개발자니까" 라는 말에 조금 기분이 넘 좋았어요. 진짜 내가 이제 개발자가 될 수 있겠다는 기분들어서요..☺️
오늘은 알콜을 냠냠하며 til을 작성해봤어요. ~다 보다 ~요 체가 좋네요.
ㅋㅋㅋㅋㅋ 그래도 많이 늘으셨으니 계속하면 좋은 곳 취직하실수 있을겁니다 큐!