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주차 과제 제출 #10

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
72 changes: 72 additions & 0 deletions JeongBean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#**사용자 관점에서의 로그인 과정 흐름**

##Q1.사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하는 순간부터 로그인에 성공하고 실패하는 순간까지의 과정을 설명하세요. (2경우 전부)
1.사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하여 로그인 버튼을 클릭합니다.
-클라이언트가 주소 /api/members/login에 로그인 정보를 post 합니다.
-findByLoginId에서 아이디가 존재하는지 조회합니다.
-아이디가 존재한다면 validationPassword로 입력한 비밀번호와 저장 되어있는 암호화된 비밀번호를 비교합니다.

###로그인 성공
2.회원정보가 있는 사용자는 로그인에 성공합니다. 웹사이트에서 제공하는 서비스를 이용합니다.
-아이디와 비밀번호 모두 기존에 저장 되어있는 정보와 일치한다면 로그인에 성공합니다.
-로그인 성공 후에 세션이 생성됩니다.

###로그인 실패
3.회원정보가 없는 사용자는 로그인에 실패합니다. 사용자는 아이디와 비밀번호를 다시 입력하여 로그인을 시도 해야합니다.
-findByLoginId에서 아이디가 존재하지 않는다면 "회원 정보를 찾을 수 없습니다." 를 반환합니다.
-validationPassword에서 비밀번호가 일치하지 않는다면 "비밀번호가 일치하지 않습니다." 를 반환합니다.

##Q2.로그인 성공 후 사용자에게 제공되는 경험을 설명하고, 특히 '로그인 유지'가 어떻게 사용자 관점에서 나타나는지 서술하세요.
1.로그인 성공 후 사용자는 해당 웹사이트에서 제공하는 다양한 서비스를(정보 조회, 게시물 작성 ...) 이용할 수 있습니다.
2.다른 페이지로 이동해도 로그인 상태는 유지됩니다.
3.브라우저를 닫았다가 다시 열어도 로그인 상태가 유지되는 경우도 있습니다.(세션 ID가 쿠키에 저장된 경우, 쿠키가 만료되지 않은 경우)

---

#**서버가 로그인한 사용자를 인식하는 방식**

##Q1.로그인한 사용자를 서버가 지속적으로 인식하기 위해 쿠키와 세션이 어떻게 사용되는지 설명하세요. (서버 딴에서 api 호출할 때마다 어떤 일이 일어나는지.)
HTTP는 요청과 응답 사이의 연결이 끝나면 상태를 기억하지 않으므로, 로그인 상태와 같은 사용자 정보를 유지하려면 세션과 쿠키가 필요합니다.
로그인 성공 후에 해당 웹사이트에서 마이페이지를 들어가려고 서버에 요청해도 서버는 동일 사용자라는 것을 알지 못합니다.
그렇기 때문에 사용자가 사이트에 로그인한 상태라는 것을 서버에게 지속적으로 인증해야 로그인 상태를 유지할 수 있습니다.
이를 해결하기 위해 사용하는 것이 세션과 쿠키입니다.

세션은 서버 측에서 사용자의 상태 정보를 저장해두는 메모리 공간입니다. 세션은 서버에서 사용자의 로그인 상태와 인증 정보를 저장합니다.
세션이 새로 생성되면 서버는 고유한 세션 ID를 자동으로 생성합니다. 이 세션 ID는 서버에서 클라이언트에게 쿠키로 전송합니다.
세션 ID를 받은 클라이언트는 쿠키로 저장하고, 서버에 요청시 세션 ID를 활용하여 로그인 상태를 유지하게 됩니다.

###로그인 후 인증 정보 관리 과정
1.로그인 시 서버는 기존의 세션을 가져오거나, 새로 세션을 생성합니다.
2.사용자 인증 정보를 저장하기 위해 Authentication 객체를 생성하고, UsernamePasswordAuthenticationToken 형식으로 사용자 인증 정보(아이디,비밀번호,권한)를 저장합니다.
3.SecurityContext에 Authentication 객체를 저장하여 인증 정보를 설정하고, SecurityContextHolder를 통해 중앙에서 접근할 수 있습니다.
4.서버는 SecurityContext를 세션에 `"SPRING_SECURITY_CONTEXT"`라는 이름으로 저장하고, 세션 ID를 클라이언트로 전송합니다.
5.클라이언트는 쿠키에 세션 ID를 저장하며, 이후 요청 시마다 쿠키에 포함된 세션 ID를 서버로 전달하여 로그인 상태를 유지합니다.


##Q2.쿠키가 세션 기반 로그인에서 어떤 역할을 하는지 구체적으로 서술하고, 특히 세션 ID가 쿠키에 저장되어 클라이언트와 서버 간에 전달되는 과정에 대해 설명하세요.
쿠키란 서버가 클라이언트에 저장하는 데이터입니다. 쿠키는 세션 ID를 저장해서 클라이언트가 서버에 요청할때 인증 상태를 유지할 수 있도록 사용됩니다.
1.세션이 생성되고 고유한 세션 ID가 자동으로 생성됩니다.
2.세션 ID는 클라이언트에 쿠키로 전달되어 저장됩니다.
3.클라이언트가 요청을 보낼 때 쿠키에 저장된 세션 ID와 함께 전송됩니다.
4.서버는 세션 ID를 받아서 세션에서 인증 정보를 확인하여 요청을 처리합니다.

---

#**세션을 구현할 때 보안적으로 고려해야할 부분이 뭐가 있을까요? (5주차 코드에는 생략되어 있음) 찾아보시기 바랍니다.**
1.CSRF 방지
CSRF(Cross-Site Request Forgery)는 유효한 상태의 사용자 세션을 공격자가 악의적으로 대신 요청을 하는 공격입니다.
이는 사용자가 의도하지 않은 비밀번호 변경, 결제 요청 등이 발생할 수 있습니다.
-CSRF 토큰 사용 : 서버는 CSRF 토큰을 클라이언트에게 제공하고, 클라이언트는 요청시 CSRF 토큰을 전송하여 사용자를 판별할 수 있습니다.
-SameSite 설정 : 쿠키가 동일한 사이트에서만 주고받을 수 있도록 설정합니다.

2.세션 타임아웃 설정
세션 타임아웃을 설정하지 않지 않은 상태에서 로그아웃을 하지 않고 종료했을 경우 다른 사용자가 사용할 수 있는 위험성이 있습니다.
-서버에서 세션 타임아웃 시간을 설정합니다. 서버가 일정 시간 동안 사용자의 요청이 없으면 자동으로 세션을 만료시키도록 설정합니다.

3.세션 고정 공격 방지
의도된 세션 ID를 사용자가 로그인하면 공격자가 사용자 계정에 접근하는 공격입니다.
-사용자가 로그인할 때마다 새로운 세션 ID를 생성합니다. 그리고 이전 세션 ID는 폐기합니다.

4.HTTPS 적용
세션 하이재킹과 같은 공격자가 사용자의 세션 ID를 탈취하는 위험을 방지하기 위해서 HTTPS를 적용해야합니다.
-HTTPS를 사용하면 클라이언트와 서버 간의 통신이 암호화되어 중간자 공격을 방지할 수 있습니다.