-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAuthService.java
More file actions
86 lines (72 loc) · 3.25 KB
/
AuthService.java
File metadata and controls
86 lines (72 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.mycom.socket.auth.service;
import com.mycom.socket.auth.jwt.JWTUtil;
import com.mycom.socket.global.exception.BadRequestException;
import com.mycom.socket.global.exception.ConflictException;
import com.mycom.socket.auth.dto.request.LoginRequestDto;
import com.mycom.socket.auth.dto.request.RegisterRequestDto;
import com.mycom.socket.auth.dto.response.LoginResponseDto;
import com.mycom.socket.go_socket.entity.Member;
import com.mycom.socket.go_socket.entity.enums.MemberRole;
import com.mycom.socket.go_socket.repository.MemberRepository;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class AuthService {
private final MemberRepository memberRepository;
private final PasswordEncoder passwordEncoder;
private final JWTUtil jwtUtil;
public LoginResponseDto login(LoginRequestDto request, HttpServletResponse response) {
Member member = memberRepository.findByEmail(request.email())
.orElseThrow(() -> new BadRequestException("가입되지 않은 이메일입니다."));
if (!passwordEncoder.matches(request.password(), member.getPassword())) {
throw new BadRequestException("잘못된 비밀번호입니다.");
}
String token = jwtUtil.createToken(member.getEmail());
// 쿠키 생성 및 설정
Cookie cookie = new Cookie("Authorization", token);
cookie.setHttpOnly(true); // JavaScript에서 접근 불가
cookie.setSecure(true); // HTTPS에서만 전송
cookie.setPath("/"); // 모든 경로에서 접근 가능
cookie.setMaxAge(1800); // 30분
response.addCookie(cookie);
return LoginResponseDto.of(
member.getEmail(),
member.getNickname()
);
}
@Transactional
public Long register(RegisterRequestDto request) {
// 이메일 중복 검사
if (memberRepository.existsByEmail(request.email())) {
throw new ConflictException("이미 존재하는 이메일입니다.");
}
// 닉네임 중복 검사
if (memberRepository.existsByNickname(request.nickname())) {
throw new ConflictException("이미 존재하는 닉네임입니다.");
}
// 이메일 인증 여부 확인
Member member = Member.builder()
.email(request.email())
.password(passwordEncoder.encode(request.password()))
.nickname(request.nickname())
.intro(request.intro())
.role(MemberRole.USER)
.build();
Member savedMember = memberRepository.save(member);
return savedMember.getId();
}
public void logout(HttpServletResponse response) {
Cookie cookie = new Cookie("Authorization", null);
cookie.setHttpOnly(true);
cookie.setSecure(true);
cookie.setPath("/");
cookie.setMaxAge(0); // 즉시 만료
response.addCookie(cookie);
}
}