캡스톤 프로젝트 일지#5

김호준·2021년 5월 13일
0

캡스톤 프로젝트

목록 보기
6/6

포스트를 좀 오랜만에 쓴다.

그동안 글 안썼던 기간중 초반엔 Crew 기능을 만들었다.
크게 어려운 기능은 아니였고 사실상 프론트 엔드가 어느정도 완성되어서 연결을 기다리는 것 밖에 할게 없었다.
어려울 것 같았던 비디오파트를 다른 팀원분이 맡으셨고, 크게 어렵지 않다고 하셨다.

그런데 중간에 팀원분이 현재 세션-쿠기 방식이 아니라 JWT 방식으로 바꿔달라고 하셨다.
요즘 JWT로 바꾸는 추세라고 연습하는김에 해보라고...

사실 OAuth2 로그인도 예제코드 붙여넣기한 수준이라 원리 하나도 모르는 상태여서 어디서부터 건드려야할지 몰랐다.


JWT가 뭔지, 어떻게 구현하는지를 배웠다. 이건 크게 어렵지는 않았다.
그런데 스프링 시큐리티에 대해 공부하려는데 매우 방대했다.
또한 스프링 시큐리티에서 OAuth2 부분도 이해하고, 커스텀 하는걸 이해하는게 매우매우 어려웠다;;

하지만 대충 스프링 시큐리티가 필터라는 걸 통해서 작동하는 것을 알았고, OAuth2를 커스텀 하는 법도 알게되었다.

이제 구현을 하려했는데 회의 때 그렇게 하지말고, 클라이언트(프론트 엔드)쪽에서 OAuth2 인증을 하게 하고 Access token만 받아서 인증하라는 제안을 받았다.
그렇게 하니까 엄청 편했다. 유저 정보를 받아오는 엔드포인트에 액세스 토큰을 날려주기만 하면 알아서 토큰이 유효한지 검증과 더불어 유저 정보를 제공해 준다.

@Transactional
    public String login(String access_token) {
        RestTemplate restTemplate = new RestTemplate();
        String url = "https://openidconnect.googleapis.com/v1/userinfo?access_token=";
        OAuthResponseVo userInfo;
        try {
            ObjectMapper mapper = new ObjectMapper();
            Map<String, String> map = mapper.readValue(access_token, Map.class);
            userInfo =  restTemplate.getForObject(url+map.get("access_token"),OAuthResponseVo.class);
        } catch (Exception e) { //유저정보 획득 실패
            log.warn("Wrong access token: {}",e.toString());
            return "";
        }
        
        /*이후 userInfo를 바탕으로 토큰 생성하고 리턴하는 로직...*/
    }

그리고 헤더에 담겨있는 JWT를 검증하는 필터를 추가해주었다.

생각보다 한건 많진 않지만, 스프링 시큐리티와 JWT에 어느정도 공부를 할 수 있었던 기회였고, 필요하다면 스프링의 기본 구현체들의 코드를 읽는 습관이 생겼던 좋은 경험이였다.


그리고 Swagger ui 를 도입하였다.


이번주 한 일

  1. Crew 기능 추가
  2. 스프링 시큐리티 공부
  3. JWT 공부
  4. 로그인 기능을 클라이언트에서 보내주는 access token을 검증하고 JWT를 만들어 주고 관리하는 방식으로 바꾸기.
  5. Swagger ui 도입

다음주 할 일

프론트 엔드와 연결했을 때 나타나는 버그 해결하기

profile
알고리즘을 좋아하는 컴공 학부생입니다

0개의 댓글