2021-06-01

0601 시큐리티 로그인 성공!!!!

1. 로그인 html안에 포함하는 css, js의 경로는 전부 절대경로를 써야한다. 그렇지 않으면 해당 resource를 불러올수없게된다. ( 아니면 securityconfig에서 resource에 대한 설정을 열어두면 된다) 

2. 계속 접근권한에러가 떠서 뭐가 문제일까 했는데, 내가 스프링 security의 구조를 제대로 파악하지 못해서 였다. 



3. authenticated (로그인, 인증) 되지 않으면 - 모든 uri자원에 접근할수없도록 설정(임시, 후에 차차 @PreAuthorized로 세밀한 설정을 할 것임. ) 

4. loginPage는 내가 보여줄 커스텀 로그인 페이지, GetMapping으로 보여주는 로그인 폼이다.

5. loginProcessURL은 스프링이 지정해둔 /login으로 한다. post전송시 여기 url으로 로그인 한 유저의 username(나의 경우엔 email이지만, 스프링의 기본 설정은 username을 식별자로 쓰고 있다)과 password가 날라갈 것이다.

6. 스프링이 username과 password를 내가 커스텀한 UserDetailService를 이용해서 DB에서 유저정보를 읽어올 것이며, 인증에 성공하면 유저가 원래 가고자 했던 uri로 자동 리다이렉트 & 세션에 유저정보를 저장해준다. 



7. 로그인 성공!!!



8. 컨트롤러에서는 @AuthenticationPrincipal이라는 어노테이션을 사용해서 유저객체를 가져올 수 있다.


9. MemberDTO는 노출되는 데이터이므로 role을 멤버변수로 넣지 않는다.

하지만 나의 코딩이 너무 아름다워서 남겨둔다...헤



10. Authorites를 꼭 눈으로 확인해보고싶었기때문에... 어렵사리~~ 코드를 짜서 확인해보았다!!! USER라는 권한이 잘 들어가 있음을 확인할 수 있다!!


11. 절대경로로 리소스를 수정한 후 -> 빌드속도가 또 느려졌다!! 음... 파일을 그냥 없애자. ㅎㅎ css는 나중에 업데이트하면 되니까!!

0601 @Embeded , @ElementCollection

 https://live-everyday.tistory.com/209

찌무룩했던 점이 시원하게 해결되었다!!!

교재에서는 @ElementCollection을 사용해서 회원의 권한(role)을 설정해주고 있는데,

김영한님 강의에서는 @Embeded를 사용해서 설정하고 있어서- 그 차이가 궁금했다!!

결론적으로는 - 엔티티 하나당 하나의 값이라면 @Embeded로 충분하고,

일대 다의 관계를 만들고 싶다면 @ElementCollection을 사용한다. 

값타입은 식별자(id) 가 없고, 그저 참조만 되어서 사용된다.

잘 만들어진 클래스 설계는 - 테이블의 갯수보다 많다고 한다!! 

자바의 값타입과 레퍼런스타입... 난 아직도 객체지향에 대한 이해가 부족한것 같다.


----------------------------

enum 타입을 쓰려면 -> @Enumerated속성을 지정해주어야 한다.

값타입은 객체이고

enum은 그냥 상수값 그자체이다!


member_role이 잘 들어갔음 테스트까지 확인!




0601 Gradle 빌드 속도 개선

 1. 어플리케이션 빌드하는데만 38s!!!! 걸려서 뭘 어떻게 업데이트할 수가 없는 상황이었다. 1분이상 걸리기도 했다...

2. 빌드 task를 확인하는데 - resource를 process하는데서 엄청나게 시간을 잡아먹고 있었다. 

3. 알고보니 사용하지 않는 svg같은 이미지들, js파일등이 용량을 차지하고 있었기 때문이었다. 그래서 static폴더안의 사용하지 않는 resources들을 깔끔하게 정리했다. 

4. 다른 사람이 미리 만든 템플릿을 사용하면 내가 css를 손대지 않아도 되므로 좋긴 하지만, 이러한 점들을 커스터마이징해서 - 사용할 것만 남기고 나머지는 없애준다!!


5. 또한 css가 css를 부르는 경우도 있으므로 파일을 열어서 꼼꼼히 확인후 사용할 것들만 남겨준다. 


6. 결과 processResouces속도가 비약적으로 향상된 것을 확인할 수 있다!!! 이제 1~2s안에 빌드를 완료한다. 

0601 Authentication

https://codevang.tistory.com/273 

약간 잘못알고 있었다. 

SecurityContextHolder가 말하자면 세션같은 저장소이고

Authentication은 그 안에 들어가는 객체

생성자에는 userDetails타입을 넣는다.

Authentication은 Principal인터페이스를 상속하는 인터페이스

이를 구현하는 클래스들 ->

principal이라는 멤버변수를 가지고 있다 & principal안에 UserDetails타입을 넣는다

따라서 principal.username하면 내가 구현한 UserDetails타입 객체의 username이 표시된다

0601 remember me 와 @PreAuthorized설정

 

1. rememberMe()설정은 매우 간단하다. 스프링부트가 해당 변수를 찾아서 자동으로 쿠키를 만들어준다. 와우!

설정후 쿠키가 생성되어 있음을 application -cookies에서 확인해볼 수 있다. 



2. @PreAuthorized , @Secured 같은 어노테이션을 활용하여 메소드 or 클래스별로 시큐리티설정을 세세하게 할 수 있다. SecurityConfig에 일일이 uri를 하드코딩하지않아도 된다는 장점이 있다. 
위와 같이 하면 스프링의 EL표기를 활용해서 좀더 자세한 보안설정이 가능해진다. 


3. SecurityConfig에서는 위와 같은 환경설정이 가능하도록 @EnableGlobalMethodSecurity어노테이션을 달아준다. 그리고 http의 requestMatcher관련을 지우고 적용해본다. 



4. /sample/exOnly 접속시 -> 로그인 창 -> 로그인을 하더라도, user1@aaa.com이 아닐경우 접근권한이 없다는 메시지를 확인할 수 있다.

0601 LoginSuccessHandler 커스텀하기

 

1. password null값으로 받는 에러가 있어서 멤버변수에 password추가하였다. 이렇게 쓰지 않을 경우 OAuth2로그인의 경우 password를 자동으로 null값으로 초기화해주기때문에 getPrincipal()에서 CLubDTO를 받으면 패스워드가 null이 뜬다. 




2. OAuth2로그인의 경우 자동으로 DB에 1111로 패스워드를 셋팅해서 강제회원가입해주기때문에, 만약 소셜로그인이고 && 패스워드가 1111이라면( 패스워드를 수정하지 않은 회원이라면) -> 패스워드 수정페이지로 이동시키는 로그인success핸들러를 구현한다.

Authentication이라는 세션변수에서 getPrincipal이라는 객체를 찾아와서 확인



3. SecurityConfig에 이와 같은 핸들러를 bean으로 등록하고 passwordEncoder를 주입해서 사용할 수 있게 한다. OAuth2로그인 후의 핸들러로 등록.



4. 현재 html페이지가 없어서 error페이지가 뜨지만 정상적으로 url이 호출되는 것을 확인할 수 있다.



0601 OAuth2 적용하기2

 

1. 구글 OAuth2에서 제공하는 정보 찍어보기

OAuth2 ID를 발급받을때 신청한 정보들이 나오는것을 알수있다.


2. 만약에 OAuth2클라이언트가 구글이라면 -> saveSocialMember메소드로 처리후, ClubMemberDTO로 반환하여 페이지에 표시한다 (ClubMemberDTO클래스의 수정필요)


3. 해당 유저의 email 받아서 repository로 DB접근, 이미 있는 회원인지 확인하고 ->

있으면 그대로 리턴

없으면 자동으로 회원가입시킨다. name에는 일단 그냥 이메일을, 비밀번호는 임시로 1111발급



4. ClubMemberDTO의 새로운 생성자로, attribute를 받을수있도록 만든다. 또한 Auth2User를 implements한다. 




5. 로그인결과 자동으로 회원가입되며 DB에도 정보가 잘 들어가는것을 볼 수 있다.

0328 fdisk, mkfs, mount, fstab

 1. 하드디스크를 붙인다. 2. fdisk -l로 하드디스크를 확인한다.  - interactiive한 커맨드모드 사용하여 (m) 붙인 하드디스크의 파티셔닝을 한다.  - 마지막에 w를 해야 실제로 반영이 된다.  3. mkfs를 하여 어떤 파일시스...