상세 컨텐츠

본문 제목

79일 - 인증과 권한. 1.인증 설정 2.권한 설정- 1) 인메모리 방법 2)db 방법 with 사용자 정보, 사용자 역할 정보

수업 일지/Spring

by NayC 2021. 6. 11. 10:29

본문

728x90

admin/notice/list 페이지를 로그인을 거쳐서 오도록 해야함

 

로그인 페이지를 가지고 와보도록 하자. 

http://localhost:8080/login 하면 login.jsp 나오도록

이렇게 묻는 것들을 원래는 admin/들어가는거에 다 해줘여겠지.

-> 당근 우리는 이런 작업은 하지 않고, 스프링의 보안 로직이 다 해준다. 우리는 쓰기만 하면 된다!

 

라이브러리 먼저? 설정 먼저? 

 

라이브러리 먼저 가지고 와보자.

 

프로젝트 우클릭 > spring > add starter > security 중에서 spring security 

- 근데 상황마다 넣어지는거 달라서 이게 공식은 아니라는거! 

우선 2개를 넣어주었다. 

 

// 설정해주자

설정은 이전에는 xml로 해줬었는데 요즘에는 다 java로. 

- 우리 설정들 config 패키지 안에다 해줬었지~ 그래서 security 관련 설정들을 해주기 위해 새롭게 하나 class를 만들었다.

 

configuration까지만 쓰고 컨트롤+스페이스 누르면 됨.

한 번 실행해보면... 아무 일도 안 일어남 ㅎㅎㅎ 

내가 주석 쓴 거 (선생님 코드랑 같음. 아래랑 둘 중 아무거나 봐도 됨) 
선생님거

다행히 패턴 URL이 있음 (이건 추후)

 

Q. ADMIN은 대문자로? 

-> 이건 db에다가 등록한 데이터로 하는건데, 우리가 정하는거 

 

// 지금은 이런 룰이 있구나~ 알기 (사용법만 알면 된다)

 

근데 실행해보니 403 에러

cf) 404 - url 발견 x, 405 = url은 찾았으나 메소드가 없다(post 요청 했는데 내가 준비한 건get 밖에 없다던지), 

403은 '보안 에러' : 권한이 없는 경우

접속하려면 인증하고 와야한다는거.

1) 로그인 페이지로 가서 로그인하고 오라고 해야겠다.

2) 스프링이 이해할 수 있도록 해줘야 함

 

1)부터 해보자.

이러면 /admin/notice/list 접속 시 로그인 페이지가 나온다! 

 

* 문제 * 

id, pwd 어떤거를 눌러도 로그인 안 됨.

- 인증 정보를 가지고 있지 않기에! 

 

detail 페이지 가보면

-> 가짐! 

admin/notice/list만 걸리는 중 

 

// -> 아래 설정 하나 더 해야.

 

cf) 인증 방법 3가지

1. 인메모리 - 사용자 계정 만들어주기

2. db

3. ldb? 엘뎁? 

 

cf) 3번 얘기를 먼저 해보자면

회사에서 관리하는 방법

 

사원이 로그인하면 > NT는 '인적자원'에서 뒤진 후에 > '정책 설정'을 확인하고 넘김 

- 정책 설정이란 예를 들어 바탕화면에는 뭐가 다운받아 있어야 한다거나 그런거

 

만약 '외부'에서 접속한다면

db 말고 nt 서버가 관리하는 '인적자원'에서 사용할 때도 있는데 

그걸 '엘뎁'(?)이라는 프로토콜 사용

 

즉, db를 이용할 수도 있지만 '엘뎁'을 사용하는게 더 편리해서 이런 방법이 있다는 것~ 

 

// 

 

1. 관리자를 아예 박아두는 방법

근데 오류남

- 받는 쪽에서 기대하는 값이 있는데, 우리가 다른 값을 보내줘서 그러함.

csrf?라는 보안 설정을 강요해서 (보안위해서) 

이 설정을 해줘야! 전달된 데이터를 받게 될 수 있다.

 

Q. CSRF (Cross site request forgery)

 

문제.

 

Cross 쪽에서 / 갑자기 post 하는 이상한 애가 생기는 것

애를 막아야 함 (그렇지 않으면 네이버 댓글이 1초만에 수백개 생기고 그럴 수도 있는것)

 

login.jsp 줄 때 특정 값을 심어서 보냄.

그리고 post할 때 '그 값'을 같이 가지고 오게 해줌

- 그 값을 가지고 있지 않으면 '넌 내가 만든 문서가 아니야'! 라고 알아챌 수 있는 것

 

// 

 

admin/notice/list 가고 / 로그인 하고 (내가 심어준거) / 했는데 오류남

 

ex) 어떤 사이트 가면 비밀번호 까먹은 적이 있었을 것

- 홈페이지는 사용자의 pwd를 그대로 기억하지 않음. '암호화' 해서 기록함. 

  근데 이 암호는 양방향이 아니라 단방향임. (지문이라는 단어로 말하기도 함)

단방향 : 영철이 올바른 key 값을 입력하지 않는 이상, 홈페이지가 저 암호를 가지고 원문을 되살릴 방법이 없음

1) 암호화해서 넣어야 함 

2) 사용자가 '정말' 입력한 값을 가지고 암호값과 비교해야함

 

// 다시 위의 오류 메시지를 읽어보면 passwordEncoding 뭐로 한거냐고 물어보는 것. 그래야 내가 비교를 하니.

우리는 암호화를 안했으니 null이라고 오류가 난 것

 

ㅡㅡㅡㅡ 

49번째줄 .and() 해주고 새로운거 써야한다는거~!

다시 실습해보고 로그인, 아이디 넣어보니 

redirect 해서 다시 로그인 페이지가 나옴

 

50번째줄.

- 사용자가 (홈페이지에서) 넣은건 암호화가 되었는데, 우리가 심은(43번째줄) 111은 암호화가 안되어서 비교가 안되고 있는 것

 

{ } 임. ()가 아니라

50번째 줄 아니고서도 가능

'이건 암호화 안한거야'라고 알려주면 됨

 

-> 그럼 들어갈 수 있게 됨! (로그인 된다는 소리)

 

//


2. 인메모리 말고 실제 db를 이용하는 방법

실제 'db'의 회원 정보 가지고 해보자.

 

(1) 사용자 정보 가져오기

2. 그 사용자의 역할 정보 가져오기

 

스프링에서 컬럼 정해져있음 (스프링에서 이렇게 안하면 일 안하겠다는거) 

- id, password, enabled 

 

Q. enabled란?

- 비활성화 (헬스장에서 '한 달 휴식'과도 비슷한 백락)

-> 우리는 중지 없고 다 활성화한걸로 '상수' 쓰는 방법이 있다. 

이런식으로

테이블 결과 보기

-> 오라클때처럼 똑같이 블록 + 엔터치면 됨 ~! 

 

Q. 근데 우리가 db에 설정한 이름들이 다른데..?

-> 별칭 이용하면 됨 

- 예를 들어 스프링은 id, password, enabled 를 원하는데 우리는 uid라고 컬럼 이름을 지었으면 uid id 이렇게 별칭 지으면 된다는 말

기본 식

// 

 

이것만 작성해서는 안 됨. '권한'에 대한 것도 해줘야 함

 

3정규화 위반이라..
같은 방식이나 빼준 거

 

// 이 모델은 관리자를 세분화 할 수 없음 (ex- 컨텐츠 관리자, 게시글 관리자... 이렇게)

 

만약 커뮤니티 관리 + 게시글 관리 역할 다 하는 관리자라면? 

-> 이 모델로는 그게 표현이 안되는 것

 

n:n 관계라면 다르게 표현해주자 ~ 

 

스프링은 이 모델을 지향함! 

 

ㅡㅡㅡㅡㅡ

 

마지막 이거 뭐징

- 이게 우리 방법인가

 

member가 admin 역할로 가능한지 vs 따로인지

 


다시 돌아오면, 

 

(2) 스프링이 원하는거 2번째 - 역할 정보 가지고 오기

- 스프링은 id, roleId 이 2가지는 꼭 달라고 요청함

 

* (수업 다 듣고) 정리 *

-> id, roleId라는 이름이 중요한게 아님. 스프링은 차례대로, 순서대로! 입력받는다는 것이 point.

    다시 아래 그림을 보면 (위에 테이블명은 무시하고) 'newlec' (사용자 아이디)와 Role_admin이라는게 나오도록 join 문장을 만들어준다~! 가 포인트. 

 

teacher 앞에도 넣어야겠지~

스프링에서는! ROLE_ 를 빼서 쓰는데, DB에는 꼭 넣어야 한다.

 

위에 모양처럼 나오게 하자. 

rold => role

오류 - 패스워드 인코딩 해달라는

 

db에서 'newlec' 사용자에 대해 pwd에에 {noop}111 넣고 다시 실행 (로그인)

그러면 된다. 

지금 2번 방식으로 하고 있다는 ~ 

cf) 아까 roldId라고 철자를 틀리게 했는데도 된 이유는, 버전이 업데이트 되면서 '순서'로 실행되서 그렇다고 한다~ 그래도 이름 맞춰주기! 

 

//

 

3번 역할을 하는 사람을 뽑아보자.

join을 해보자.

id가 아니라 role의 네임이 나오도록 join 다시 한 번

m.uid = r.name


join 복습

우선 목표 : 이 '순서대로' 데이터를 가지고 오기 (위에 이름 id, roleId는 그냥 '이름'인거고 스프링은 순서로 인식해서 이 순서대로 데이터 줄 수 있도록 쿼리식 작성하는게 포인트)

 

어느 테이블들 가지고 할거냐면 Member, Role, MemberRole (아래 사진 순서대로)

Member
Role
MemberRole

// 

 

1.  member 테이블에서 uid를, rold 테이블에서 name을 가지고 와야함 (그리고 이름은 id, roleId로 하자~) 

2. from Member m (테이블 Member에서부터 시작. join을 이제 하겠다.)

3. (Member하고) MemberRole을 join 하겠다. -> 자 이제 roleId가 각각 옆에 생겼지

4. join을 또 해. mr.roleId와 r.id가 같게 join하면 -> role의 name까지 붙지

 


 

 

근데 이러면 안 됨

사용자가 전달한건 3이 아니라서

-> 

이렇게.

한 다음에 복사 붙여넣기 해서 아래로. 

 

끝에는 띄어쓰기 한 번씩 해주기!! 

 

 

* 더 배워야 할 것 *

1) 컨트롤러에서 뽑아 사용할 수 있는 방법

2) 페이지의 일부 영역은 '권한'에 따라 나오고 안나오도록 해줘야 함

 

 

 

 

 

 

 

 

cf) 타임리프 

- jsp하면 따로 공부 가능한 것으로... 보임. 

 

리액트(페이스북) vs 앵귤러(구글, ms에서 만든 거)

- 완전히 다른 선상에서 비교해야함

- 리액트는 '바벨? 스크립트' (표준화된 모듈화가 없음. 한 플랫폼을 누가 지정해주지 않음. '마음대로 사용')

  앵귤러는 '타입스크립트' (단일화 해주었음)

 

"인간은 타이핑 치려고 코딩하는게 아니다. 

 내가 생각한걸 '만드려고' 코딩하는거지." 

- 그래서 선생님은 개인적으로 코드를 적게 쳐도 되는 ms거를 선호하신다고 

 

 

 

728x90
반응형

관련글 더보기