[인스타그램 클론코딩] 03. 로그인 구현(Back-End)

2023. 2. 1. 13:49·Web/인스타 클론 코딩

로그인은 Email과 password를 받아와 검증 후, JWT Access Token을 발행하는 로직으로 진행한다.

 

1. LoginRequestDto, LoginResponseDto 작성

@Data
public class LoginRequestDto {

    @NotBlank(message = "빈 항목이 존재합니다.")
    @Email(message = "이메일 양식이 올바르지 않습니다.")
    private String email;

    @NotBlank(message = "빈 항목이 존재합니다.")
    private String password;

    @Builder
    public LoginRequestDto(String email, String password) {
        this.email = email;
        this.password = password;
    }
}

@Data
public class LoginResponseDto {
    private String accessToken;

    @Builder
    public LoginResponseDto(String accessToken) {
        this.accessToken = accessToken;
    }
}

 

- LoginRequestDto 는 JSR-303 검증을 통해 이메일 형식인지, Blank인지를 검증한다.
- 검증 성공 시, key값이 accessToken으로 JWT 토큰을 담아 응답한다.

 

2. JwtTokenProvider 생성

implementation 'io.jsonwebtoken:jjwt:0.9.1'

 

- jsonwebtoken 라이브러리를 사용하여 JWT 토큰을 생성한다.

 

jwt:
  secret: {사용자 지정 Secret Key}
  access-token-expire-time: 18000000000

 

- application.yml에 서명을 위한 secret 키와 토큰 만료시간을 설정해준다.

 

@Component
public class JwtTokenProvider {

    @Value("${jwt.access-token-expire-time}")
    private Long expireTime;

    @Value("${jwt.secret}")
    private String secretKey;

    public String createJwt(String email) {
        Claims claims = Jwts.claims();
        claims.put("email", email);

        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + expireTime))
                .signWith(SignatureAlgorithm.HS256, secretKey)
                .compact();
    }
}

 

- Jwt 토큰에 사용자 email을 클레임으로 삽입 및 생성시간/만료시간 설정 후 서버에 지정한 secretKey를 통해 HS256 알고리즘으로 암호화 한다.

 

3. UserService login 구현

@Transactional
public String login(LoginRequestDto requestDto) throws Exception {
    String email = requestDto.getEmail();
    String password = requestDto.getPassword();

    User savedUser = userRepository.findByEmail(email).orElseThrow(() -> new UsernameNotFoundException("로그인 정보가 잘못되었습니다."));

    if(passwordEncoder.matches(password, savedUser.getPassword())) {
        String token = jwtTokenProvider.createJwt(email);
        log.info("User [{}] token published -> {}", email, token);
        return token;
    }
    else {
        throw new Exception("로그인 정보가 잘못되었습니다.");
    }
}

 

- 입력받은 email을 통하여 DB에서 해당 유저를 찾아 savedUser에 저장한다.

- passwordEncoder의 matches 메서드를 통하여 입력받은 비밀번호와 DB에 저장된 비밀번호가 같은지 검사하고, 일치한다면 Jwt 토큰을 발행하며 그렇지 않다면 예외를 발생시킨다.

 

4. UserController login 구현

@PostMapping("/login")
public ResponseEntity login(@Valid @RequestBody LoginRequestDto requestDto, BindingResult bindingResult) {
    if(bindingResult.hasErrors()) {
        String errorMsg = bindingResult.getFieldError().getDefaultMessage();

        return ResponseEntity.badRequest().body(errorMsg);
    }
    try {
        String accessToken = userService.login(requestDto);
        return ResponseEntity.ok().body(LoginResponseDto.builder().accessToken(accessToken).build());
    } catch (Exception e) {
        return ResponseEntity.badRequest().body(e.getMessage());
    }
}

 

- JSR-303 검증을 통해 입력 형식에 오류가 있다면 오류메시지와 함께 400 에러를 발생시킨다.

- userService의 로그인 로직을 정상적으로 수행하면, LoginResponseDto에 accessToken을 담아 응답하고, 그렇지 않다면 오류메시지와 함께 400에러를 응답한다.

저작자표시 비영리 변경금지 (새창열림)

'Web > 인스타 클론 코딩' 카테고리의 다른 글

[인스타그램 클론코딩] 04. JWT 필터 구현(Back-End)  (0) 2023.02.01
[인스타그램 클론코딩] 03. 로그인 구현(Front-End)  (0) 2023.02.01
[인스타그램 클론코딩] 02. 회원 가입 구현(Front-End)  (0) 2023.01.31
[인스타그램 클론코딩] 02. 회원 가입 구현(Back-End)  (0) 2023.01.31
[인스타그램 클론코딩] 01. 기술 스택 정하기  (0) 2023.01.31
'Web/인스타 클론 코딩' 카테고리의 다른 글
  • [인스타그램 클론코딩] 04. JWT 필터 구현(Back-End)
  • [인스타그램 클론코딩] 03. 로그인 구현(Front-End)
  • [인스타그램 클론코딩] 02. 회원 가입 구현(Front-End)
  • [인스타그램 클론코딩] 02. 회원 가입 구현(Back-End)
뚝딱뚝딱2
뚝딱뚝딱2
  • 뚝딱뚝딱2
    개발도상국
    뚝딱뚝딱2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 공부
        • Java
        • Spring Boot
        • LORA
      • Web
        • 인스타 클론 코딩
        • GPT 응답 API 서버
        • Spring Boot 예외 처리
        • 코테 준비용 서비스 만들기
      • DevOps
        • 쿠버네티스
        • 서버 만들기
      • 코딩테스트
        • 알고리즘
      • 교육
        • 스파르타코딩클럽 - 내일배움단
        • 혼자 공부하는 컴퓨터 구조 운영체제
      • 잡다한것
  • 블로그 메뉴

    • 홈
  • 링크

    • GITHUB
  • 공지사항

  • 인기 글

  • 태그

    오블완
    스프링 부트
    MSA
    mapstruct
    리액트
    REST API
    예외
    쿠버네티스
    react
    백준
    티스토리챌린지
    OpenAI API
    Java
    spring boot
    Entity
    인스타그램
    클러스터
    스프링부트
    chat GPT
    클론코딩
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
뚝딱뚝딱2
[인스타그램 클론코딩] 03. 로그인 구현(Back-End)
상단으로

티스토리툴바