대머리개발자

간단 로그인 프로세스 본문

개발이야기/자봐

간단 로그인 프로세스

대머리개발자 2023. 6. 15. 23:49
728x90

전체 플로우 : ID / PW -> OK -> JWT 리턴

 

API 요청 시 JWT를 헤더에 박아줌! (프론트 처리)

헤더에서 JWT를 꺼내서 검증(백엔드 처리)

 

Oauth 서버 최근에 구축해 놓은거 가져다 쓸까 했는데 투머취다.. 배보다 배꼽..

해서 간단하게 토큰을 만드는 리소스만 복붙하려고 보는데..

 

새로운 버전은 릴리즈(?) 되었고

확인해봤더니..하위 호환을 안 되고....  @deprecated 되고 지롤s

 

앗..

 

모든 것이 내탓이다. ㅠㅠ

애초에 최신 버전으로 진행 했어야 했는데...아미타불..

 

기존 이미 충분히 잘 운영되고 있고 특별하게 문제가 없다면 굳이 최신 버전으로 마이그레이션 할 필요는 없지만

신규로 시작하는 프로젝트는 최신 버전으로 진행 되는 것이 좋을 듯 하다. 

 

다시 본론으로 돌아와....

 

백엔드의 로그인 핵심 

넘겨받는 계정정보와 패스워드를 확인 후 토큰을 넘겨 주는 것이다.

 

실패시 응답코드는 "400"으로 바인딩하고 프론트에서 응답코드만 보고 그냥 스낵바!!!

 

1 .로그인 후 JWT 리턴 

class UserService @Autowired constructor(val userRepository: UserRepository,
                                         val modelMapper: ModelMapper,
                                         val jwtTokenProvider: JwtTokenProvider

){
    fun loginCheck(userDto: UserDto): APIResult{
        val userDtoFromDB = userRepository.getUserInfo(userDto.loginId)?.let { modelMapper.map(it, UserDto::class.java)  }
            ?: throw DefinedException(400, ExceptionCode.BAD_REQUEST, "no user information")

        if(userDtoFromDB.password != userDto.password){
            throw DefinedException(400, ExceptionCode.BAD_REQUEST, "wrong password")
        }

        // 토큰 설정s
        userDtoFromDB.setLoginToken(jwtTokenProvider.createToken(userDtoFromDB.loginId))
        return APIResult(userDtoFromDB)
    }
}

 

SI성으로 개발한다면 단순하게 아웃풋만을 생각하고 코드를 작성할 것이다. 내가 유지보수를 하지 않을 테니.ㅋ

하지만 언제든 고객의 니즈는 변화고 그에 맞춰서 아웃풋도 변해야 한다.

그래서 확장성을 고려 하지 않는다면 새로운 요구사항!!!이 나올 때마다..

간단해 보이지만

수십개의 코드를 수정해야고 사이드 이펙트 작렬하고 결국 전사 테스트를 해야하고........

 

내가 싼 똥은 내가 치우자!!.. 이 바닥이 생각보다 많이 좁다. ㅎㅎ

 

자꾸 샛길로 센다.

 

무엇을 이야기 하고 싶었냐면 이거다.

 

 - 객체를 주입하는 부분을 하나의 클래스에서 관리하자.

 - 객체의 주입은 외부에서 진행하자!

 

하나의 코드 하나의 기능을 만들때는 와 닿지 않는 이야기다.

 

솔루션을 가지고 나가서 구축형으로 회사에 요구사항에 맞는 커스텀 개발을 해야 했다.

솔루션 코어를 변경하지 않고 커스텀 환경에서 객체를 수정하려면 위에 있는 내용처럼 해야 좀더 유연할 것이다.

(코어를 직접 수정을 하는 구조에서 코어가 업데이트 된다면...?.........퇴사각이다.)

 

그래서 지금의 환경 !! 클라우드 환경. 너무 좋다.

그냥 만들어진 형태되로 ㅆㅓ라 이눔들아!!

 

 

2 . JWT 검정 

로그인 API를 제외하고 모든 *EndPoint는 토큰을 검증해야 한다. AOP로 처리! 물론 필터도 쌉가능!

@Aspect
@Component
class AuthAspect {
    @Before("execution(* com.*.*EndPoint.*(..))")
    fun setAuthorDefault(jointPoint: JoinPoint) {
        // 로그인 메서드를 제외하고는 전부 jwt 검증
        if(!jointPoint.signature.name.equals("login")){
            val requestAttributes = RequestContextHolder.currentRequestAttributes() as ServletRequestAttributes
            val auth = requestAttributes.request.getHeader("Authorization")
                ?: throw DefinedException(400, ExceptionCode.UN_AUTHORIZED, "no auth")

            if(!Utils.getJwtTokenProvider().validateToken(auth.split("Bearer ")[1]))
                throw DefinedException(400, ExceptionCode.UN_AUTHORIZED, "no valid token")
            
        }
    }
}

로그인 후 전달 받은 토큰을 통해 API 검증......

012

 

 

 

### 리팩s!!!

 

필요한 유틸들과 혹은 다른 Service를 호출 해야 한다면  생성자는 늘어날수 밖에 없는 구조.. 위 코드에서만 벌써 3개. 인자는 적을 수록 깔끔스 하지.

 

따라서 모든 DI를 다른곳에서 이쁘게 정렬해서 가져다 쓰는 형태로!!!!!!! (companion object)

 

로또 어플 ..배포..해보자.. 얼마 안남았다...더럽게 힘들다... 하악하악.

728x90

'개발이야기 > 자봐' 카테고리의 다른 글

jib 이용한 컨테이너 배포  (0) 2023.07.25
로또플줵 - 끝이(?)  (0) 2023.06.19
16차 월급루팡의 일지(쉼표,)  (1) 2023.06.05
인증서버 - 포럼게시판(코틀린)  (1) 2023.05.19
JPA - 더티체킹  (0) 2023.04.18