회고록

백수의 삶 ( with. google login, servlet )

yemong 2025. 10. 23. 15:19

부트캠프 수료를 마치고 허영부영 생활을 보내고 취업을 도전해 보려 했지만 부족한 부분을 너무 많이 느껴 배웠던 부분을 다시 공부하며 제대로 알고 나 자신의 언어로 표현할 수 있도록 연습하려고 한다.

앞으로 학습한 부분을 적고 일주일동안 어떻게 공부했는지 되돌아 보려고 한다.

 

공부한 부분

 

google 로그인

 

구글 로그인을 OIDC(OpenId Connect)방식으로 구현했다. 구글 로그인 버튼을 누르면 리다이렉트가 되어 로그인이 완료가 되어 authorization code를 서버로 받게 된다. 그 코드를 통해 idToken을 발급받고 구글에서 제공하는 클래스를 통해 해당 토큰이 유효한지 검증한다. 검증이 완료되면 해당 토큰의 payload로 검증된 사용자의 정보를 추출하고 DB에 저장하고 자체 JWT를 발급하는 흐름으로 구현했다.

 

        GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier
                .Builder(new NetHttpTransport(), JacksonFactory.getDefaultInstance())
                .setAudience(Collections.singletonList(googleClientId))
                .build();

        // 토큰 검증
        GoogleIdToken idToken = verifier.verify(idTokenString);

위의 코드는 구글에서 제공하는 클래스를 이용하여 검증을 하는 코드로 클래스 GoogleIdTokenVerifier를 이용하여 검증을 할 수 있다.

NetHttpTransport()란 Google의 공개키를 가져오기 위한 http 요청을 수행하는 객체이며 JackSonFactory를 이용하여 JSON 형식으로 토큰을 파싱하기 위한 JSON 처리 라이브러리이다. 또한 setAudience를 이용하여 애플리케이션의 googleClientId와 토큰의 aud가 일치한지 검증한다.

 

 

servelt

서블릿이란 http 요청과 응답을 처리하기 위한 자바 기반 클래스이다. 클라이언트가 요청을 보내면 서블릿 컨테이너가 해당 서블릿 인스턴스를 실행시켜 요청을 수행한다. 요청이 완료되면 서블릿 인스턴스는 사라지지 않고 재사용을 위해 컨테이너 내부에 유지된다.

 

서블릿의 주요 기능중 클라이언트의 요청을 처리하는 방식으로는 대표적으로 forward, redirect가 있다.

forward란 클라이언트가 요청을 보내면 서블릿이 요청 처리를 다른 서블릿에게 위임하는 방식을 말한다. 이러한 방식은 내부적으로 이루어지는 방식으로 클라이언트는 알 수 없다. 

redirect는 클라이언트가 요청을 보내면 서블릿이 다른 서블릿(url)으로 요청하라는 응답(HTTP 302)을 보내는 방법이다. 

 

http 특성상 요청 간의 상태를 유지하지 않는(stateless) 한계가 있다. 그래서 사용자의 상태나 정보를 유지하기 위한 cookiesession이 있다.

cookie 브라우저에 데이터를 저장하고 session은 서버 메모리에 사용자의 상태를 저장한다.

 

서블릿을 공부하게 되면서 spring security 내부적으로 세션을 활용해 인증 정보를 관리한다는 점을 알게 되었다.

 

filter

 

Filter는 요청과 응답의 전후 처리를 담당하며 서블릿 앞단에 위치하고 있다. filter, servlet을 담당하는 것이 톰캣이다. spring에서 톰캣인 서블릿컨테이너 안에 filter가 있다. 즉, 서블릿 컨테이너 안에서 관리하는 또다른 객체를 말한다. doFilter 메서드에 서블릿이 갔다온 전후를 기록하여 시간을 계산할 수도 있다.

 

security

비밀번호는 법적으로 단방향 암호화(one-way bcrpytion)방식으로 저장해야한다. 단방향 암호화란 평문(plain text)를 암호화 처리된 값 복호화 할 수 없는 암호문(digest)으로 변환하는 방식이다. 즉, 암호화된 결과값에서 원래 비밀번호를 다시 알아낼 수 없다. 단방향 암호는 해시 함수(hash function)가 사용된다. 해시 함수는 입력값에 대해 항상 일정한 길이의 결과값(해시값)을 생성한다. 대표적으로 SHA-256, SHA-512 등이 있다. 하지만 단순 해시만으로 보안이 충분하지 않기 때문에 salting 기법과 key stretching(시간 지연)기법이 추가된다. salting 기법이란 비밀번호마다 랜덤한 문자열(salt)을 추가하여 같은 비밀번호라도 서로 다른 해시 결과를 만들게 하는 기법이다. key stretching 기법이란 해시 연산을 여러번 반복하여 공격자가 무차별 대입을 시도하기 어렵게 만드는 방법이다. 이 두가지를 결합한 대표적인 단방향 암호화 알고리즘이 bcrpty이다.