[TIL 2021.06.10] Oauth 통한 JWT 발급 그리고 Interceptor구현 / 호눅스와의 면담

kyukim·2021년 6월 10일
2

TIL

목록 보기
151/322

오늘은 Oauth 통한 JWT 발급 그리고 Interceptor 구현하는 것 까지 MJ로부터 1:1 가르침을 받았어요. MJ에게 정말 감사하다는 말씀을 드립니다🙏

배운 것을 간략하게 정리하자면 이렇습니다.

깃헙 서버에 AccessToken 을 담아서 요청

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 발급을 위해서 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);

Interceptor 구현

인터셉터는 맨앞단에서 들어오는 모든 트래픽을 먼저 처리해줘요.
어떤 형식으로 구현되는지 아직은 잘 모르겠어요. 어쨋든

먼저 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는 뭔지 말안해도 감이 오죠?

Interceptor로 들어온 JWT 데이터 분석

https://github.com/kyu-kim-kr/issue-tracker/pull/20/commits/4f7c1b3e5ce0940d11d3b2b7b38da7040c6f105d

호눅스와의 면담

호눅신과의 면담

  1. 자바, 스프링, 디비, 네트워크 현재 내 지식수준은 취업을 하기에 충분한 것 같다 -> X
  2. 하나라도 공부했다는 완결된 컨텐츠가 필요하다.
  3. 예를들면, 자바면 자바의정석 완독, 디비면 SQL 첫걸음 완독, 네트워크면 김영한님 HTTP 네트워크 등
  4. 난 취업 눈이 낮으니까 SI업체도 괜찮을거 같고 아니면 사람인에서 찾아보는 걸 추천. 조인스타트업이나 여러경로로 도움을 요청.

처음 코쿼 시작하기전에 목표는 취업이었는데 구체적인 계획없이 매일 열심히하자 정도여서 아무것도 느끼지 못하고 있었는데 취업하기 전에 필요한 지식들을 셀프체크 해보니 스스로 전부 너무나 부족하다는 것을 와닿아버렸습니다.

특별히 기억나는 호눅스가 조언 해주신 것은 하나라도 공부했다는 완결된 컨텐츠가 필요하다는 것! 맞는거 같아요. 이제 한국에 가면 공부방향을 좀 틀어야겠습니다.

ㅋㅋㅋ

근데 호눅스가 저한테 나이를 물어보시고 제가 대답했는데 "음 개발자니까 그정도면 나이는 괜찮아요" 라고 말씀하셨는데, "개발자니까" 라는 말에 조금 기분이 넘 좋았어요. 진짜 내가 이제 개발자가 될 수 있겠다는 기분들어서요..☺️

오늘은 알콜을 냠냠하며 til을 작성해봤어요. ~다 보다 ~요 체가 좋네요.

2개의 댓글

comment-user-thumbnail
2021년 6월 11일

ㅋㅋㅋㅋㅋ 그래도 많이 늘으셨으니 계속하면 좋은 곳 취직하실수 있을겁니다 큐!

1개의 답글