Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/inyeob step1 #12

Open
wants to merge 25 commits into
base: inyeob
Choose a base branch
from
Open

Feature/inyeob step1 #12

wants to merge 25 commits into from

Conversation

inshining
Copy link
Contributor

Step1 구현

  • 유저 엔티티 생성
  • 회원 가입 기능
  • 로그인 기능 구현

왜 JWT를 선택했는지?

  • 세션에 비해서 서버 부화를 줄이기 위한 선택 : 본 서비스의 데이터 베이스인 SQLite는 동시에 다중 사용자를 지원하지 않기 때문에 최대한 서버 부화를 줄일 수 있는 방향을 지향하였다. 서버 사이드에서 부당이 적은 토큰 방식을 선택하였다.
  • 보안 위험성이 크지 않은 서비스 : 토큰은 세션 방식에 비해서 탈취시 위험성이 커진다고 한다. "콬" 서비스는 다른 서비스(금융 서비스)에 비해서 보안 위험성보다 서버 부화 줄이는 쪽으로 더 이득일 것이라는 예상을 해볼 수 있었다.
  • 요새 많이 쓴다고 해서 꼭 한 번 구현해보고 싶었다.

왜 SQLite 선택했는지?

  • 기존 H2 와 다른 선택하고 싶어서
  • H2보다 범용적으로 다른 언어에서 지원할 수 있음
  • h2와 다른 옵션으로 구현해나가야 하기 때문에 배울 것이 많다.
  • 디비 하나가 하나 파일이라는 점이 복잡하지 않아서 마음에 들었다. (다른 대형 디비 보다)
  • 혼자하는 프로젝트이기때문에 소형 디비를 써도 된다고 보았다.

SQLite DB 를 추가하였음. DB Config 생성하였고, sqlite properties를 생성하여서 둘 config 파일이 이를 따르게 하였다.
도메인 패키지와 엔티티 패키지 생성
created, modified 를 공통적으로 사용할 수 있게 BaseTimeEntity 생성
유저 엔티티 생성
spring security 를 이용해서 회원 가입을 구현하였다.
회원 가입을 하기 위해서 username(아이디), password, name이 필요하다.
org.xerial:sqlite-jdbc의 버전을 3.7.2에서 3.40.1로 업그레이드
@inshining inshining requested review from jyoo0515 and smmin21 October 11, 2023 13:09
@inshining inshining self-assigned this Oct 11, 2023
String header = request.getHeader("Authorization");
if (header != null && header.startsWith("Bearer ")) {
try {
String accessToken = header.substring(7);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

꿀팁) "Bearer ".length 해도 됨

reissueLimit = refreshExpirationHours * 60 / expirationMinutes;
}
public String createAccessToken(String userSpec){
Algorithm algorithm = Algorithm.HMAC256("gdscys2023");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이런 string constant 도 따로 빼두던가 properties 에 두는 것도 좋을 듯! 각각에 하드코딩 되어 있으면 바뀔 때 놓치기 쉬워서

Algorithm algorithm = Algorithm.HMAC256("gdscys2023");

return JWT.create()
// TODO: 만료 기한 정하기
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

만료기한 정해주세요 ㅋㅋㅋㅋㅋㅋ

@@ -0,0 +1,4 @@
package com.inshining.poke.domain.dto;

public record SignInRequest(String username, String password) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

record 👍

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Comment on lines 42 to 48
public static User from(SignUpRequest request, PasswordEncoder encoder){
return User.builder()
.username(request.username())
.password(encoder.encode(request.password()))
.name(request.name())
.build();
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

굳이 spring bean 을 인자로 주입 받으면서 static 한 메소드로 User 엔티티를 만들 필요는 없는 듯! 엔티티의 책임을 벗어나는 일 같은데 SignUpRequest 로 부터 사용자의 입력값을 추출하고 그를 바탕으로 User 엔티티를 만드는 일은 Service 의 역할인 것 같습니다.

Comment on lines 28 to 32
try {
userRepository.flush();
} catch (DataIntegrityViolationException | ConstraintViolationException e) {
throw new IllegalArgumentException("이미 사용 중인 아이디입니다.");
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flush 를 해보고 try catch 를 하는 것보단 existsByUsername 같은 repository 메소드를 정의해서 확인하는게 더 낫지 않을까요?

Comment on lines +26 to +28
public SignInResponse signIn(@RequestBody SignInRequest request) {
return service.signIn(request);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

큰 상관은 없지만 보통 쿠키 말고 헤더를 사용하는 access token 을 내려줄 때 body 로 내려주기 보단 X-SET-ACCESS-TOKEN 같은 헤더값으로 내려주긴 합니다. 이유는 여러가지가 있지만 클라에서 body 읽기보다 헤더 읽기가 더 간단해서, body 로 내려주면 로그 찍으면 바로 보여서, 그냥 그래와서.. 등등등 이 있습니다

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants