1. 로그인 기능의 기본 흐름
로그인은 사용자가 입력한 아이디와 비밀번호를 서버에서 확인하고, 인증에 사용할 정보를 반환하는 과정이다.
전체적인 흐름은 다음과 같다.
아이디 + 비밀번호 입력
↓
서버에 로그인 요청
↓
아이디로 회원 조회
↓
회원이 존재하는지 확인
↓
비밀번호 확인
↓
로그인 성공
↓
API Key 반환
아이디가 존재하지 않거나 비밀번호가 일치하지 않는 경우에는 로그인에 실패하도록 처리한다.
2. Member에 로그인에 필요한 정보 저장하기
회원 Entity에는 로그인에 필요한 아이디, 비밀번호와 함께 로그인 이후 인증에 사용할 apiKey를 저장한다.
@Entity
@Getter
@NoArgsConstructor
public class Member extends BaseEntity {
@Column(unique = true)
private String username;
private String password;
private String nickname;
@Column(unique = true)
private String apiKey;
public Member(String username, String password, String nickname) {
this.username = username;
this.password = password;
this.nickname = nickname;
this.apiKey = UUID.randomUUID().toString();
}
}
username과 apiKey에는 unique = true를 설정하여 중복된 값이 저장되지 않도록 한다.
회원이 생성될 때 UUID를 이용해 API Key를 발급한다.
3. 로그인 요청 데이터 받기
로그인할 때 클라이언트에서는 아이디와 비밀번호를 전달한다.
record LoginReqBody(
@NotBlank
String username,
@NotBlank
String password
) {
}
JSON으로 요청한다면 다음과 같은 형태가 된다.
{
"username": "user1",
"password": "1234"
}
Spring에서는 @RequestBody를 이용해 요청의 JSON 데이터를 객체로 받을 수 있다.
@PostMapping
public RsData<MemberDto> login(
@RequestBody @Valid LoginReqBody reqBody
) {
// 로그인 처리
}
4. 아이디로 회원 조회하기
먼저 입력받은 아이디로 회원이 존재하는지 확인한다.
Member actor = memberService
.findByUsername(reqBody.username())
.orElseThrow(() ->
new ServiceException(
"401-1",
"존재하지 않는 회원입니다."
)
);
회원이 존재하지 않는다면 로그인에 실패하고, 회원이 존재한다면 다음 단계로 넘어간다.
username
↓
findByUsername()
↓
회원 존재?
┌───────┴───────┐
아니오 예
↓ ↓
로그인 실패 비밀번호 확인
5. 비밀번호 확인하기
회원이 존재한다면 입력한 비밀번호와 회원의 비밀번호를 비교한다.
if (!actor.getPassword().equals(reqBody.password())) {
throw new ServiceException(
"401-2",
"비밀번호가 일치하지 않습니다."
);
}
비밀번호가 일치하지 않으면 로그인에 실패한다.
비밀번호까지 일치하면 로그인이 성공한 것으로 처리한다.
6. 로그인 성공 시 API Key 반환하기
로그인이 성공하면 이후 API 요청에서 사용할 수 있도록 해당 회원의 API Key를 반환한다.
record LoginResBody(
MemberDto memberDto,
String apiKey
) {
}
로그인 성공 시에는 회원 정보와 API Key를 함께 전달한다.
return new RsData<>(
"200-1",
"%s님 반갑습니다!".formatted(actor.getNickname()),
new LoginResBody(
new MemberDto(actor),
actor.getApiKey()
)
);
여기서 중요한 부분은 로그인할 때 입력받은 비밀번호를 다시 반환하는 것이 아니라, 회원에게 발급되어 있던 API Key를 반환한다는 것이다.
프론트엔드는 로그인 성공 후 전달받은 API Key를 이용해 이후 API 요청을 인증할 수 있다.
7. 로그인 전체 코드
앞의 내용을 하나로 합치면 다음과 같은 구조가 된다.
record LoginReqBody(
@NotBlank
String username,
@NotBlank
String password
) {
}
record LoginResBody(
MemberDto memberDto,
String apiKey
) {
}
@PostMapping
public RsData<LoginResBody> login(
@RequestBody @Valid LoginReqBody reqBody
) {
Member actor = memberService
.findByUsername(reqBody.username())
.orElseThrow(() ->
new ServiceException(
"401-1",
"존재하지 않는 회원입니다."
)
);
if (!actor.getPassword().equals(reqBody.password())) {
throw new ServiceException(
"401-2",
"비밀번호가 일치하지 않습니다."
);
}
return new RsData<>(
"200-1",
"%s님 반갑습니다!".formatted(actor.getNickname()),
new LoginResBody(
new MemberDto(actor),
actor.getApiKey()
)
);
}
'BackEnd > Spring' 카테고리의 다른 글
| [Spring] Cookie를 이용한 인증 처리 (0) | 2026.09.04 |
|---|---|
| [Postman] API Key 변수 관리와 Authorization Header 활용하기 (0) | 2026.09.02 |
| [Spring] API Key를 이용한 인증 처리 (0) | 2026.09.01 |
| [Spring] 예외 처리 | ServiceException과 전역 예외 처리 (0) | 2026.09.01 |
| Spring Boot 프로젝트 Railway 배포하기 + 배포 과정에서 발생한 오류 해결 (0) | 2026.08.27 |
댓글