Skip to content

Commit 460b4a6

Browse files
authored
Merge pull request #106 from tjdals-dbs/main
[9주차/윤샘] 워크북 제출합니다
2 parents 9c2462e + 7ebd51f commit 460b4a6

8 files changed

Lines changed: 253 additions & 0 deletions

File tree

keyword/chapter09/keyword.md

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
- 세션과 토큰의 차이는?
2+
3+
**세션과 토큰**
4+
5+
기본적으로 상태를 기억하지 않는 환경에서 “이 사용자가 누구인지”를 이어서 확인하기 위한 방식
6+
7+
- 세션
8+
9+
서버가 인증 상태를 세션에 저장, 클라이언트는 세션 ID를 보유
10+
11+
- 토큰
12+
13+
클라이언트가 인증에 사용할 토큰을 보유, 서버는 요청마다 토큰을 검증
14+
15+
16+
**세션 방식**
17+
18+
로그인에 성공하면 서버가 세션 저장소에 사용자 인증 상태를 저장
19+
20+
클라이언트는 세션 ID를 쿠키로 받고, 이후 요청마다 그 쿠키를 같이 전송
21+
22+
```
23+
1. 클라이언트가 로그인 요청
24+
2. 서버가 세션 생성
25+
3. 서버가 세션 ID를 쿠키로 전달
26+
4. 클라이언트가 이후 요청마다 세션 ID 쿠키 전송
27+
5. 서버가 세션 ID로 사용자 상태 조회
28+
```
29+
30+
```
31+
Client → Server : 로그인
32+
Server → Client : Set-Cookie: JSESSIONID=...
33+
Client → Server : Cookie: JSESSIONID=...
34+
Server : 세션 저장소에서 사용자 확인
35+
```
36+
37+
세션 방식 : 서버가 상태를 기억→ Stateful
38+
39+
장점
40+
41+
- 서버가 인증 상태를 직접 관리하므로 로그아웃, 만료, 강제 종료 처리가 비교적 명확함
42+
- 민감한 사용자 정보를 클라이언트에 직접 담지 않아도 됨
43+
44+
단점
45+
46+
- 서버가 세션 상태를 저장해야 함. 여러 대라면? 공유 저장소 필요
47+
- 쿠키 기반이면 CSRF 같은 문제도 같이 고려해야 함
48+
49+
**토큰 방식**
50+
51+
로그인에 성공하면 서버가 토큰을 발급, 클라이언트가 토큰을 저장
52+
53+
이후 요청마다 토큰을 함께 전송, 서버는 그 토큰을 검증해서 사용자를 확인
54+
55+
```
56+
1. 클라이언트가 로그인 요청
57+
2. 서버가 토큰 발급
58+
3. 클라이언트가 토큰 저장
59+
4. 클라이언트가 이후 요청마다 토큰 전송
60+
5. 서버가 토큰 검증 후 사용자 확인
61+
```
62+
63+
```
64+
Client → Server : 로그인
65+
Server → Client : access token
66+
Client → Server : Authorization: Bearer {token}
67+
Server : 토큰 검증 후 사용자 확인
68+
```
69+
70+
토큰 방식은 서버가 세션을 저장하지 않고 요청마다 토큰을 검증하는 구조로 만들 수 있어서 Stateless에 가깝게 설계할 수 있음
71+
72+
다만 모든 토큰 방식이 완전히 Stateless인 것은 아님
73+
74+
예를 들어 서버가 토큰을 DB나 Redis에 저장하고 매번 조회한다면, 서버 쪽 상태가 섞인 구조가 됨
75+
76+
장점
77+
78+
- 서버가 세션을 저장하지 않아 확장에 유리함
79+
- 서버가 여러 대여도 토큰 검증만 가능하면 인증 처리가 가능함
80+
81+
단점
82+
83+
- 토큰이 탈취되면 만료 전까지 위험⬆️
84+
- 로그아웃이나 토큰 강제 만료 처리가 세션보다 복잡함
85+
- 토큰 저장 위치와 재발급 전략에 주의가 요구
86+
87+
- +JWT와 연결
88+
89+
JWT는 토큰의 한 종류
90+
91+
토큰 안에 사용자 식별자, 권한, 만료 시간 같은 정보를 담고, 서명을 통해 위조 여부를 검증
92+
93+
```
94+
Header.Payload.Signature
95+
```
96+
97+
하지만 JWT의 Payload는 암호화가 아니라 인코딩에 가까워서 **누구나 디코딩해서 볼 수 있음
98+
99+
그래서 비밀번호, 주민번호, 인증번호 같은 민감한 정보는 넣으면 안 됨.
100+
101+
102+
https://velog.io/@ddangle/Session%EC%84%B8%EC%85%98%EA%B3%BC-Token%ED%86%A0%ED%81%B0%EC%9D%98-%EC%B0%A8%EC%9D%B4%EB%8A%94
103+
104+
https://closed-on-sunday.tistory.com/6
105+
106+
- 엑세스 토큰과 리프레시 토큰이란?
107+
108+
**액세스 토큰과 리프레시 토큰**
109+
110+
- Access Token
111+
112+
실제 API에 접근할 때 사용하는 토큰
113+
114+
- Refresh Token
115+
116+
Access Token이 만료되었을 때 새 Access Token을 발급받기 위한 토큰
117+
118+
119+
**Access Token**
120+
121+
사용자가 보호된 리소스에 접근할 때 제출하는 토큰
122+
123+
서버는 Access Token을 보고 “이 요청을 보낸 사용자가 누구인지”, “어떤 권한을 가졌는지”를 확인함
124+
125+
```
126+
Client → Server
127+
Authorization: Bearer {accessToken}
128+
```
129+
130+
Access Token은 보통 유효 시간을 짧게 둠
131+
132+
탈취되었을 때 공격자가 그 토큰으로 API를 호출할 수 있기 때문
133+
134+
ex) JWT Access Token
135+
136+
```json
137+
{
138+
"sub": "user@example.com", // subject
139+
"role": "USER",
140+
"iat": 1710000000, // issued at -> 발급 시간
141+
"exp": 1710001800 // expiration time
142+
}
143+
```
144+
145+
**Refresh Token**
146+
147+
Access Token을 새로 발급받기 위해 사용하는 토큰
148+
149+
```
150+
1. Access Token 만료
151+
2. Client가 Refresh Token으로 재발급 요청
152+
3. Server가 Refresh Token 검증
153+
4. 새로운 Access Token 발급
154+
```
155+
156+
```
157+
Client → Server : refresh token
158+
Server → Client : new access token
159+
```
160+
161+
보통 Access Token보다 오래 유지 ⇒ 더 조심해서 관리
162+
163+
**나누는 이유**
164+
165+
Access Token 길게 유지 → 사용자는 편리, but 탈취되었을 때 위험 시간⬆️
166+
167+
Access Token 짧게 유지 → 사용자가 자주 다시 로그인해야 해서 불편
168+
169+
⇒ **Refresh Tok**en을 두어 Access Token을 재발급 받을 때만 사용
170+
171+
**주의점**
172+
173+
로그아웃을 구현하려면 Refresh Token을 삭제하거나 더 이상 사용할 수 없게 만드는 처리가 필요함
174+
175+
JWT Access Token은 이미 발급된 뒤 만료 전까지 유효
176+
177+
⇒ 즉시 무효화가 필요하다면 블랙리스트나 토큰 버전 관리 같은 추가 전략이 필요
178+
179+
https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-Access-Token-Refresh-Token-%EC%9B%90%EB%A6%AC-feat-JWT
180+
181+
- OAuth 1.0과 OAuth 2.0의 차이는?
182+
183+
**OAuth**
184+
185+
사용자가 자신의 비밀번호를 직접 넘기지 않고, 특정 서비스가 내 정보나 리소스에 제한적으로 접근할 수 있도록 권한을 위임하는 방식
186+
187+
⇒ 비밀번호를 알려주지 않고 접근 권한만 위임하는 프레임워크
188+
189+
ex) 카카오 계정으로 로그인, 구글 캘린더 접근 권한을 허용
190+
191+
**OAuth 1.0**
192+
193+
OAuth의 초기 버전
194+
195+
요청마다 서명을 만들어서 요청이 변조되지 않았는지 확인하는 방식
196+
197+
OAuth 1.0에서는 클라이언트가 요청을 보낼 때 여러 값들을 조합해서 서명을 만들고, 서버는 같은 방식으로 서명을 검증함
198+
199+
⇒ 보안⬆️, but 구현이 복잡함
200+
201+
특징
202+
203+
- 요청마다 서명(signature)을 생성해서 검증
204+
- 토큰뿐 아니라 토큰 시크릿도 함께 다룸
205+
- HTTPS에만 의존하지 않고 요청 자체의 서명 검증을 중요하게 봄
206+
- 구현 난이도가 높고, 클라이언트 입장에서 처리할 것이 많음
207+
208+
```
209+
요청 정보 + nonce + timestamp + secret
210+
→ signature 생성
211+
→ 서버가 signature 검증
212+
```
213+
214+
**OAuth 2.0**
215+
216+
OAuth 1.0을 더 단순하고 유연하게 다시 설계한 버전
217+
218+
오늘날 대부분의 소셜 로그인, 외부 API 권한 위임에서 OAuth 2.0이 사용
219+
220+
OAuth 2.0에서는 Access Token을 발급, 클라이언트는 그 토큰을 이용해서 리소스 서버에 요청
221+
222+
Bearer Token 방식 → 토큰을 가진 사람이 권한을 가짐
223+
⇒ 토큰이 탈취되지 않도록 HTTPS 사용과 토큰 보관이 중요
224+
225+
특징
226+
227+
- Access Token 중심의 구조
228+
- Authorization Code, Client Credentials 같은 여러 흐름을 제공
229+
- 모바일 앱, SPA, 서버 사이드 웹 등 다양한 클라이언트 환경을 고려
230+
- Refresh Token을 통한 재발급 구조를 사용할 수 있음
231+
- 구현은 OAuth 1.0보다 단순하지만, 토큰 보호가 매우 중요
232+
233+
```
234+
1. 사용자가 권한 동의
235+
2. 클라이언트가 Authorization Code 받음
236+
3. 클라이언트가 Code로 Access Token 요청
237+
4. Access Token으로 리소스 서버에 접근
238+
```
239+
240+
https://velog.io/@hyg8702/OAuth%EB%9E%80-OAuth1-vs-OAuth2

mission/chapter09/jwt_login.png

71.6 KB
Loading
64.7 KB
Loading
76.4 KB
Loading

mission/chapter09/mission.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
## JWT 토큰 방식의 회원가입, 로그인 구현하고 마이페이지도 워크북과 같은 형식으로 개선하기
2+
![jwt_login.png](jwt_login.png)
3+
#### 로그인
4+
![jwt_mypage_fail.png](jwt_mypage_fail.png)
5+
#### 로그인X, 마이페이지 조회
6+
![jwt_mypage_success.png](jwt_mypage_success.png)
7+
#### 로그인O, 마이페이지 조회
8+
9+
## JWT + OAuth 구현하기
10+
![oauth_kakao.png](oauth_kakao.png)
11+
#### OAuth 카카오 로그인
12+
![oauth_login_mypage.png](oauth_login_mypage.png)
13+
#### 카카오 로그인 + 마이페이지 조회

mission/chapter09/oauth_kakao.png

41 KB
Loading
65.7 KB
Loading

mission/chapter09/week09_green.png

41.5 KB
Loading

0 commit comments

Comments
 (0)