Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

조유성 5주차 과제 제출 #9

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions inho/JoYuSung.md
Original file line number Diff line number Diff line change
@@ -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. 세션 타임아웃 설정
적절한 세션 만료 시간 설정하여 일정 시간 동안 요청이 없으면 세션 자동 종료