WIL 5주차(김영현)
webWIL 5주차 스프링부트!
session 활용하기
session.setAttribute("logInUserInfo", userId);
int id = (int) session.getAttribute("logInUserInfo");
- 이런식으로 set, get을 이용하여 세션에 원하는 값을 저장할 수 있다.
-
logInUserInfo 이름으로 세션을 저장해서 당연히 session에도 이러한 이름을 가진 값이 있을거라고 생각했는데
JSESSIONID=70F70A07DC4EB4899A82EE3A67467CD0; 이런식으로 전혀 이해할 수 없는 값이 저장되어 있었다.
아직 찾아보지는 못했지만 암호화 인 것 같은데 한번 찾아봐야 겠다.
user nickname 바꾸기
- 처음 nickname 관련 코드를 만들어볼때 들어오는 값은 nickname 하나인데 또 관련 dto를 생성해야 하나 고민했다.
-
하나가 들어오는데 return type 을 맞추기 위해서 새로운 dto 생성을 해야한다는게 매우 불필요하다고 생각했었다.
어떤 키워드로 검색을 해야할지도 모르겠어서 고민하다가 리드님 깃을 보게 되었고 매우 간단한 방법을 알게 되었다.
if(userRepository.existsUserByNickname(nickName)){
return Optional.empty();
//~생략
return Optional.of(user);
- Optional.of / .empty()로 간단하게 구현이 가능했다..
- controller 부분에서 isEmpty() 함수로 간단하게 체크 가능할 수 있어서 더 깔끔하고 편리한 코드라고 생각이 들었다.
login 구현하기
람다식의 return
- 저번주에 배웠던 message 값이 ““인지 아닌지로 값이 제대로 들어왔는지 판단했던것과 같이
- session을 만드는데 필요한 user_id를 0인지 아닌지로 판단하여 로그인을 구현하고 싶었다.
public int login(LoginDto loginDto){ Optional<User> user = userRepository.findByUserId(loginDto.getUserId()); user.ifPresent(getUser->{ return getUser.getId(); })
- 이와 같이 만약 DB에 일치하는 유저가 있다면 user의 id만 return하게 만들고 싶었는데 return 타입이 맞지 않다는 오류가 나왔다.
- 한참을 고민해본 결과 ifPresent 내부의 람다식에 return을 했기 때문에 login함수에 return을 해주는게 아니였다.
passwordEncoder match
- 또한 비밀번호를 확인하기 위해서는 들어온 비밀번호를 먼저 one way hash func에 넣은 후 나온 값과 비교해야 한다고 생각했는데 매우 잘못된 생각이였다.
- 당연하게도 유저들중에는 같은 비밀번호를 쓰는 사람이 있을것이고 같은 비밀번호에 대해서 같은 hash 값이 나온다면 보안에 취약해지기 때문에 같은 비밀번호라도 다른 비밀번호가 나와야 한다.
- 그래서 비밀번호를 확인하기 위한 함수를 통해 확인해야 했다.
-
boolean checkPassword = passwordEncoder.matches(loginDto.getPassword(), getUser.getPassword());
- 위의 두가지 문제를 해결한 뒤 다음과 같은 코드가 나왔다.
-
public int login(LoginDto loginDto){ Optional<User> user = userRepository.findByUserId(loginDto.getUserId()); if (user.isPresent()){ User getUser = user.get(); boolean checkPassword = passwordEncoder.matches(loginDto.getPassword(), getUser.getPassword()); if (checkPassword){ return getUser.getId(); } else{ return 0; } } return 0; }
- 0이 나온다면 로그인이 되지 않은 것이고 0 외의 값이 나왔다면 DB에 있다는 뜻이기 때문에 정상적으로 로그인이 진행된다.
미흡한 부분
- 아직 board 부분 API 2가지를 구현하지 못했다.. 생각보다 return type 맞추는게 어려웠다,,
다음 목표
- JSESSIONID 생성 규칙? 찾아보기
- Board 부분 완성 못한 2가지 진행