diff --git a/inho/JoYuSung.md b/inho/JoYuSung.md new file mode 100644 index 0000000..fea2f7d --- /dev/null +++ b/inho/JoYuSung.md @@ -0,0 +1,62 @@ +1. 사용자 관점에서의 로그인 과정 흐름 + +1-1. 사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하는 순간부터 로그인에 성공하고 실패하는 순간까지의 과정을 설명하세요. + +사용자가 로그인 페이지에서 ID와 비밀번호를 입력하면 JSON 형태의 LoginReqDto로 서버에 전송됩니다. +컨트롤러(MemberController)는 이 요청을 받아 memberService.login() 메소드를 호출합니다. +서비스 계층에서는 다음과 같은 검증 절차를 수행합니다. +입력된 loginId로 회원 정보를 데이터베이스에서 조회 -> 해당 회원이 존재하지 않으면 예외 발생 +-> PasswordEncoder를 사용해 입력된 비밀번호와 저장된 암호화된 비밀번호를 비교 ->비밀번호가 일치하지 않으면 예외 발생 + + +인증 성공 시: +Session 객체 생성 +인증 정보를 보관하는 SecurityContext 객체에 생성 및 인증 정보 저장 +인증 컨텍스트를 보관하는 SecurityContextHolder에 SecurityContext 설정 +세션에 SecurityContext 저장 +최종적으로 MemberLoginResDto를 통해 로그인 성공 응답을 반환합니다. + +인증 실패 시: +존재하지 않는 ID일 경우: findByLoginId 결과 없음 → IllegalArgumentException 발생 +잘못된 비밀번호일 경우: PasswordEncoder.matches() 실패 → IllegalStateException 발생 +최종적으로 클라이언트에게 에러 메시지가 전달되고 세션 객체는 생성되지 않습니다. + +1-2. 로그인 성공 후 사용자에게 제공되는 경험을 설명하고, 특히 '로그인 유지'가 어떻게 사용자 관점에서 나타나는지 서술하세요. + +클라이언트에 전달된 JSESSIONID로 서버가 세션 식별 +(서버에서 발급된 JSESSIONID가 쿠키를 통해 관리되고 이후 클라이언트가 요청을 보낼 때마다 이 쿠키가 활용됨. 예를 들어 요청마다 해당 세션에 저장된 사용자의 정보가 인증된 정보인지 서버가 판단) +Member 엔티티의 정보를 통해 사용자 인증 상태 유지(SecurityContext객체를 통해 유지) +Spring Security의 SecurityContextHolder로 인증 상태 관리(Authentication객체를 통해 인 증된 사용자 보관) +세션이 유지되는 동안 지속적으로 인증된 사용자로 서비스 이용 가능(위의 과정을 통해 생성된 사용자를 Session객체에 저장됨) + +최종적으로 사용자는 세션이 만료되거나 로그아웃 되기 전까지, 로그인한 서비스의 다른 페이지정보를 요청하거나 새로 고침을 하여도 +처음에 발급된 JSESSIONID를 통해 별 다른 추가 인증 없이 로그인 상태를 유지하며 서비스를 지속적으로 이용할 수 있습니다. + +2. 서버가 로그인한 사용자를 인식하는 방식: + +2-1. 로그인한 사용자를 서버가 지속적으로 인식하기 위해 쿠키와 세션이 어떻게 사용되는지 설명하세요. + +서버는 로그인 성공 시 고유한 세션 ID를 생성합니다. +이 세션 ID는 JSESSIONID이고, 이는 쿠키에 담겨 클라이언트에게 전달됩니다. +클라이언트는 이후 모든 요청에 이 쿠키를 자동으로 포함시킵니다. +서버는 요청에 포함된 JSESSIONID를 통해 해당하는 세션을 찾아 사용자를 식별합니다. +이렇게 생성된 세션 객체는 클라이언트가 로그아웃을 하거나 세션이 만료될 때 까지 유지됩니다. + +2-2. 쿠키가 세션 기반 로그인에서 어떤 역할을 하는지 구체적으로 서술하고, 특히 세션 ID가 쿠키에 저장되어 클라이언트와 서버 간에 전달되는 과정에 대해 설명하세요. + +쿠키는 세션 기반 로그인에서 불필요한 과정을 줄여줍니다. 예를 들어 클라이언트가 서버에 특정한 요청을 했을 때, 이 요청이 있을 때 마다 서버에서 사용자에 대한 인증이나 인가와 같은 +절차를 일일이 수행하지 않고 첫 요청에 이 클라이언트를 구분하기 위한 SESSIONID를 생성하여 전달하고, 자동으로 다음 요청시엔 클라이언트의 요청에 SESSIONID가 +쿠키에 담아서 전달되고, 서버에서 이 ID를 조회하며 추가적인 절차를 거치지 않고 클라이언트를 식별해낼 수 있도록 하는 역할을 합니다. + +3. 세션을 구현할 때 보안적으로 고려해야할 사항 + +3-1. Secure 플래그 설정 +쿠키의 Secure 플래그를 활성화하여 HTTPS 통신에서만 쿠키가 전송되도록 설정 +(HTTP통신 같은 경우는 암호화 되지 않는 방법으로 전송 되기 때문에 네트워크 상에서 데이터가 그대로 노출 될 위험이 있음 ) + +3-2. HttpOnly 플래그 설정 +쿠키에 HttpOnly 플래그를 설정하여 JavaScript를 통한 쿠키 접근을 차단 +(공격자가 XSS공격을 통해 악성 스크립트가 실행되면 쿠키가 탈취될 수 있는데, 이를 방지하기 위해 해당 플래그를 통해 JavaScript에서 쿠키에 접근하지 못하도록 해야함 ) + +3-3. 세션 타임아웃 설정 +적절한 세션 만료 시간 설정하여 일정 시간 동안 요청이 없으면 세션 자동 종료 \ No newline at end of file