Spring.10_로그인 프로그램

이혜민·2024년 9월 10일

spring

목록 보기
11/18

< 수업 순서 - 2024.09.10 >

1. userinfo 테이블은 이미 생성

2. Userinfo DAO 클래스

3. UserinfoMapper.xml : 전달값이 있을 때만 전달

  • 동적 SQL 기능 구현 - set 엘리먼트 사용 : if 엘리먼트의 조건이 맞을 때만 동작 구현

4. UserinfoMapper 인터페이스 : XML 매퍼와 바인딩될 인터페이스

5. UserinfoDAO 인터페이스 : 객체를 저장할 수 있는 자료형으로 사용

6. UserinfoDAOImpl DAO 클래스 : @Repository 어노테이션 사용하여 Spring Bean 등록

  • SqlSession 정보(객체)를 저장하기 위한 필드 작성 - @RequiredArgsConstructor 어노테이션(final 제한자가 작성된 필드만 최기화)을 이용해 생성자 레벨의 의존성 주입

  • sqlSession 객체로 getMapper() 메소드를 호출하여 Mapper 인터페이스를 불러와(바인딩) 데이버베이스의 쿼리 실행

7. UserinfoService 인터페이스 : 요청 처리 메소드에서 데이터 처리에 필요한 기능들을 구현하기 위해 Service 클래스를 작성

  • loginAuth(Userinfo userinfo) : 로그일할 때 사용되는 메소드

8. UserinfoServiceImpl Service 클래스 : @Service 어노테이션을 사용하여 Spring Bean으로 등록

  • DAO 클래스의 메소드를 호출하여 데이터 처리 기능을 구현 - DAO 클래스 필드 생성하여 객체 저장(@RequiredArgsConstructor 어노테이션을 이용해 생성자 레벨의 의존성 주입)

  • 예외를 명확히 구분하여 예외 처리시 사용하기 위해 예외클래스를 작성해 예외 발생

사용자로부터 입력받아 전달된 문자열(비밀번호)을 암호화 처리하는 방법

1. jbcrypt 라이브러리를 프로젝트에 빌드 처리 - 메이븐 : pom.xml

  • pom.xml 빌드 처리 완료

2. BCrypt.hashpw(String password, String salt) 메소드를 호출하여 문자열(비밀번호)을 암호화 처리

  • 메소드의 매개변수에는 암호화 처리할 문자열과 첨가물의 문자열을 전달받아 암호화 처리
  • 첨가물에 의해 비밀번호가 다르게 암호화 처리
  • BCrypt.gensalt(int log_bound) : 매개변수에 첨가물의 길이를 전달받아 첨가물을 생성하여 반환하는 정적메소드 - 매개변수에 값을 전달하지 않으면 기본값으로 [10]으로 설정
    • userinfo 필드에 저장된 Password를 가져와 암호화 처리할 문자열로 지정

3. BCrypt.checkpw(String plainText, String hashed) 정적메소드를 호출하여 일반 문자열과 암호화 처리된 문자열을 비교하여 다른 경우 [false]를 반환하고 같은 경우 [true]를 반환받아 처리

  • 테이블 행에 저장된 비밀번호 값과 현재 로그인을 위해 입력한 비밀번호 값이 같지 않으면 false를 반환 → ![false] = true → LoginAuthFailException 예외 발생

9. xyz.itwill09.exception 패키지 생성

10. ExistsUserinfoException : 회원정보를 등록할 때 사용자로부터 입력받아 회원정보의 아이디가 기존 회원정보의 아이디와 중복될 경우 발생될 예외를 생성하기 위한 예외클래스 - RuntimeException 상속받아 작성

  • 예외 처리는 RuntimeException 상속받아 작성 클래스를 상속받은 예외 처리, 안 받은 예외 처리 두가지로 나뉜다.

  • RuntimeException 클래스를 상속받으면 try catch나 extends 예외 처리를 하지 않아도 됨.

  • 매개변수가 없는 기본 생성자, 매개변수(String message, Userinfo userinfo)가 있는 생성자 작성

  • Service 클래스에서 사용

11. UserinfoNotFoundException : 회원정보에 대한 변경, 삭제, 검색할 때 페이지 요청시 전달받은 아이디의 회원정보를 찾을 수 없는 경우 발생될 예외를 생성하기 위한 예외클래스

12. LoginAuthFailException : 로그인 처리할 때 전달받은 아이디와 비밀번호에 대한 인증이 실패한 경우 발생될 예외를 생성하기 위한 예외클래스

13. UserinfoController : 요청 처리 메소드 작성

① 회원정보를 입력받기 위한 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드 → 관리자만 요청 가능한 페이지

  • session에 저장된 로그인 정보를 매개변수로 작성하여 로그인 정보를 반환받아 Userinfo 객체에 저장

  • 클라이언트가 /write 페이지를 GET 방식으로 요청하였을 때 loginUserinfo 값이 없거나(비로그인) 9가 아니면(관리자가 아닌 경우) 비정상적인 방법으로 간주하여 에러 메세지 출력

  • userinfo 폴더에 있는 user_write.jsp 반환

② 회원정보를 전달받아 USERINFO 테이블의 행으로 삽입하고 로그인 페이지를 요청할 수 있는 URL 주소를 반환하는 요청 처리 메소드

  • jsp 문서에서 입력한 userinfo를 테이블에 삽입하는 메소드

➡️설명 : user_write.JSP에서 회원정보를 입력하고 회원등록을 누르면 userCreate() 함수가 실행되면서 /userinfo/write를 요청하여 post 방식으로 write() 메소드가 실행된다.

  • JSP 문서에서 입력한 값을 매개변수인 Userinfo 객체에 저장

  • 매개변수로 전달받은 회원정보의 아이디가 중복될 경우 ExistsUserinfoException 발생

  • userinfoService 객체로 addUserinfo() 메소드를 호출하여 jsp 문서에서 입력받은 값이 저장된 userinfo 객체를 행에 삽입. 그 후 리다이렉트 이동으로 userinfo 폴더에 있는 login 페이지 반환

14. user_write.jsp : 회원정보를 입력받아 회원등록을 하는 JSP 문서

15. UserinfoController(수정)

③ 인증정보를 입력받기 위한 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드

  • 클라이언트가 /login 페이지를 GET 방식으로 요청하면 메소드 실행하여 user_login.jsp 반환

④ 인증정보를 전달받아 USERINFO 테이블에 저장된 행을 검색하여 로그인 처리하고 환영메세지를 출력하는 JSP 문서의 뷰이름 반환하는 요청 처리 메소드

➡️설명 : user_login.jsp 문서에서 아이디와 비밀번호를 입력하고 로그인을 클릭하면 userLogin() 함수가 실행되면서 userinfo 폴더에 있는 login을 요청

  • 입력받은 아이디와 비밀번호를 저장할 userinfo 객체와 loginUserinfo값을 전달해줄 HttpSession 객체를 매개변수로 작성

  • 매개변수로 전달받은 회원정보로 인증이 실패한 경우 LoginAuthFailException 발생

  • 인증된 로그인 정보를 authUserinfo 객체에 저장

  • 세션에 인증된 로그인정보로 변경

  • user_login.jsp 요청

16. user_login.jsp : 아이디, 비밀번호 입력하여 로그인하는 JSP 문서 - session에 loginUserinfo 저장됨.

  • loginUserinfo가 없다면 아이디, 비밀번호 입력 창이 표시되고 있다면 로그인 회원에 대한 환영메세지 출력

  • 로그인 회원의 권한이 관리자일 경우 회원등록 버튼 활성화

17. BadRequestException : 비정상적인 요청인 경우 발생될 예외를 생성하기 위한 예외클래스

18. UserinfoController(수정)

⑤ 로그아웃 처리하고 로그인 페이지를 요청할 수 있는 URL 주소를 반환하는 요청 처리 메소드

  • HttpSession.invalidate() : 사용자의 세션을 종료시켜 사용자의 세션 정보를 모두 삭제

  • 리다이렉트 이동으로 login 페이지 요청

  • login 페이지 요청시 loginUserinfo 데이터가 모두 삭제되어 아이디, 비밀번호 입력창이 표시된다.

⑥ USERINFO 테이블에 저장된 모든 행을 검색하여 Request Scope 속성값으로 저장하고 회원목록을 출력하는 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드 → 로그인 사용자만 요청 가능한 페이지

  • /list 페이지 요청시 처리되는 메소드

  • 전달받을 값은 없고 뷰에 전달해줄 값을 model 객체로 인해 전달하기 위해 매개변수로 작성. 로그인 정보를 확인해야하기 때문에 HttpSession 객체를 매개변수로 작성

  • 로그인 정보가 없다면 비정상적인 요청으로 에러 발생

  • model 객체에 userinfoList라는 이름으로 userinfoService 클래스의 getUserinfoList() 메소드 호출하여 전체 회원목록을 저장

  • user_list.jsp 요청

19. user_list.jsp : 회원목록을 <c:forEach>를 이용해 반복 출력

  • 이름을 클릭하였을 때 해당 아이디를 전달하여 view.jsp 페이지로 이동

20. UserinfoController(수정)

⑦ 아이디를 전달받아 USERINFO 테이블에 저장된 행을 검색하여 Request Scope 속성값으로 저장하고 외원정보를 출력하는 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드 → 로그인 사용자만 요청 가능한 페이지

  • /view 페이지를 요청하면 처리되는 메소드

  • 아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 뷰에 검색한 행을 전달해야하기 때문에 Model 객체 매개변수로 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록

  • 로그인 정보가 존재하지 않으면 비정상적인 방법으로 요청하여 예외 발생

  • model 객체에 userinfo 라는 이름으로 userinfoService 클래스의 getUserinfo() 메소드를 호출해 매개변수로 전달받안 userid에 해당하는 행을 검색하여 저장

  • user_view 페이지 요청

21. user_view.jsp : list.jsp에서 이름을 클릭했을 때 해당 아이디에 대한 아이디, 이름, 이메일 정보 출력

  • 로그인 정보가 관리자(auth=9)인 경우에만 수정, 삭제 버튼 활성화
  • 수정 버튼을 눌렀을 때 modify페이지로 userid값을 가지고 이동
  • 삭제 버튼을 눌렀을 때 userRemove(userid) 함수 실행되어 remove 페이지로 userid값을 가지고 이동

22. UserinfoController(수정)

⑧ 아이디를 전달받아 USERINFO 테이블에 저장된 행을 검색하여 Request Scope 속성값으로 저장하고 회원정보를 변경하는 JSP 문서의 뷰이름을 반환하는 요청 처리 메소드

  • /modify 페이지를 GET 방식으로 요청하였을 때 처리되는 메소드

  • 아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 뷰에 검색한 행을 전달해야하기 때문에 Model 객체 매개변수로 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록

  • 세션에 저장된 로그인 정보를 loginUserinfo 객체에 저장

  • 페이지를 요청한 사용자가 비로그인 사용자이거나 관리자가 아닌 경우 인위적 예외 발생

  • userinfo라는 이름으로 전달받은 아이디에 해당하는 행을 검색하여 model 객체에 속성값으로 저장

  • user_modify.jsp 페이지 반환

⑨ 변경할 회원정보를 전달받아 USERINFO 테이블에 저장된 행을 변경하고 회원정보 출력 페이지를 요청할 수 있는 URL 주소를 반환하는 요청 처리 메소드

  • 변경할 행을 저장하기 위해 userinfo 객체를 매개변수로 등록, 로그인 정보로 권한을 확인해야하기 때문에 로그인 정보가 저장되어있는 session 객체 매개변수로 등록

  • userinfoService 클래스의 modifyUserinfo() 메소드 호출하여 매개변수로 userinfo 행을 수정

  • 로그인 사용자와 변경 처리된 사용자가 동일한 경우 세션에 저장된 권한 관련 속성값 변경

  • 리다이렉트 이동으로 view 페이지로 userid값을 가지고 이동

23. user_modify.jsp

  • 비밀번호를 제외한 기존 회원정보를 input 태그의 기본 text 값으로 지정(value 속성값)

  • 수정 클릭 시 userModify() 함수 실행되어 modify 페이지 요청 - ⑨

24. UserinfoController(수정)

⑩ 아이디를 전달받아 USERINFO 테이블에 저장된 행을 삭제하고 회원목록 출력 페이지를 요청할 수 있는 URL 주소를 반환하는 요청 처리 메소드

  • 아이디를 전달받아야 하기 때문에 매개변수로 String userid 등록, 로그인 정보를 인증해야하기때문에 HttpSession 객체 매개변수로 등록

  • 세션에 저장된 로그인 정보를 loginUserinfo 객체에 저장

  • 페이지를 요청한 사용자가 비로그인 사용자이거나 관리자가 아닌 경우 인위적 예외 발생

  • userinfoService 클래스의 removeUserinfo() 메소드 호출하여 해당 userid의 행 삭제

  • 로그인 사용자와 삭제 처리된 회원정보의 아이디가 동일한 경우 로그아웃 페이지로 리다이렉트 이동 처리

  • 아닐시 list 페이지로 리다이렉트 이동 처리

예외를 처리할 수 있는 메소드 작성

25. ExceptionController

  • @ExceptionHandler : 예외 처리 기능을 제공하는 메소드를 설정하기 위한 어노테이션 → Controller 클래스의 요청 처리 메소드에서 예외가 발생될 경우 예외 처리를 위해 Front Controller가 자동으로 호출되는 메소드 - 예외 처리 메소드(Spring AOP 기능 사용)

    • value 속성 : 예외 처리하기 위한 클래스의 Class 객체를 속성값으로 설정
  • @ControllerAdvice : 예외 처리 메소드만 작성된 Controller 클래스를 Spring Bean으로 등록하기 위한 어노테이션 → 모든 Controller 클래스의 요청 처리 메소드에서 발생된 예외를 제공받아 예외 처리 가능

< 수업 순서 - 2024.09.11 >

1. UserinfoController(수정) : 인터셉터를 사용해 권한 관련 처리 기능 구현

  • 필터는 Front Controller의 이전 위치에 존재하여 실행되고 인터셉터는 Front Controller의 다음 위치에 존재하여 실행

  • 필터 클래스는 web.xml(WAS 환경설정파일)에 등록

  • 인터셉터는 front controller에 의해 관리되기 때문에 spring bean으로 등록(servlet-context.xml)

2. AdminAuthInterceptor : 관리자 관련 권한 처리를 위해 작성된 Interceptor 클래스 → 요청 처리 메소드 호출 전에 비로그인 사용자 또는 관리자가 아닌 사용자가 페이지를 요청할 경우 인위적 예외 발생

  • 인터셉터 : 요청 처리 메소드의 명령 실행 전 또는 실행 후에 실행될 명령을 제공하는 기능
    → HandlerInterceptor 인터페이스의 기본 메소드 중 필요한 메소드만 오버라이드 선언하여 사용

preHandler() 메소드

  • 요청 처리 메소드가 호출되기 전에 실행될 명령을 작성하기 위한 메소드
    • false 반환 : 요청 처리 메소드 미호출
    • true 반환 : 요청 처리 메소드 호출
  • ➡️설명 : 세션에 저장되어있는 로그인 정보를 저장해 로그인 정보가 없어가(null) 로그인 사용자의 권한이 관리자가 아닌 경우(!=9) BadRequestException 예외 발생. 권한이 있으면 메소드 실행, 없으면 실행X

3. LoginUserAuthInterceptor : 로그인 사용자 관련 권한 처리를 위해 작성된 Interceptor 클래스 → 요청 처리 메소드 호출 전에 비로그인 사용자가 페이지를 요청할 경우 인위적 예외 발생

preHandler() 메소드

  • ➡️설명 : 세션에 저장된 로그인 정보를 저장하여 로그인 정보가 없는 경우(null) BadRequestException 예외 발생

4. servlet-context.xml : Interceptor 클래스를 작성하여 Spring Bean으로 등록

  • bean 엘리먼트를 이용해 AdminAuthInterceptor, LoginUserAuthInterceptor 클래스를 Spring Bean으로 등록

  • 스프링 컨테이너가 두 개의 클래스를 객체로 만들어놓으면 Front Controller가 객체를 달라고해서 사용

  • interceptors : interceptor 엘리먼트를 등록하기 위한 엘리먼트

  • interceptor : Front Controller로 Interceptor 객체의 메소드를 호출하기 위한 규칙을 제공하기 위한 엘리먼트

  • mapping : 인터셉터가 동작될 요청 페이지 경로를 제공하는 엘리먼트 - path 속성 : 요청 페이지 경로

    • mapping 엘리먼트의 path 속성값으로 [*] 기호를 사용해 요청 페이지 설정 가능
    • [*] : 폴더의 모든 페이지를 요청한 경우
    • [**] : 폴더 및 하위 폴더의 모든 페이지를 요청한 경우
    • exclude-mapping : 인터셉터가 동작되지 않는 요청 페이지 경로를 제공하는 엘리먼트
  • ref : Front Controller에 의해 사용될 Interceptor 객체를 제공하기 위한 엘리먼트 - bean 속성 : Interceptor 클래스의 Spring Bean 식별자(beanName)

  • ➡️설명 : mapping 엘리먼트에 요청 페이지의 경로를 작성하여 작성된 페이지가 요청될 때 adminAuthInterceptor 클래스의 메소드 호출. userinfo 폴더의 login 페이지를 제외한 모든 페이지를 요청할 때 LoginAuthInterceptor 클래스의 메소드 호출

0개의 댓글