๋ณธ ํ๋ก์ ํธ ๊ฐ๋ฐ์ ๊ณผ์ ํ์์ ํ์ด๋ ํ๋ก์ ํธ ๊ธฐํ, ๊ฐ๋ฐ, ๋ฐฐํฌ ๊ณผ์ ์ ๋ด๊ณ ์์ต๋๋ค.
OneStack
์๋ฆฐ๋์ฟ ์ต๊ณ ์์ด์! ์์ฑ์ : Kyle โญ๏ธ โญ๏ธ โญ๏ธ โญ๏ธ โญ๏ธ
www.onestack.store
1. ์์ ๋ก๊ทธ์ธ์ด ํ์ํ ์ด์
์์ ๋ก๊ทธ์ธ์ ์ฌ์ฉ์์ ํธ์์ฑ์ ๋์ด๊ณ ๋ณด์์ ๊ฐํํ๋ ์ค์ํ ๊ธฐ๋ฅ์ด๋ค.
์ด๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ์ป์ ์ ์๋ค.
- ์ฌ์ฉ์ ํธ์์ฑ: ๋ณ๋์ ํ์๊ฐ์ ์์ด ๊ธฐ์กด ๊ณ์ ์ผ๋ก ๋น ๋ฅด๊ฒ ๋ก๊ทธ์ธํ ์ ์๋ค.
- ์ ๋ขฐ์ฑ ํฅ์: ๊ฒ์ฆ๋ ํ๋ซํผ์ ์ธ์ฆ ์์คํ ์ ํ์ฉํ ์ ์๋ค.
- ๊ฐ๋ฐ ํจ์จ์ฑ: ๋ณด์ ์ธ์ฆ ๋ก์ง์ ์ธ๋ถ ํ๋ซํผ์ ์์ํ ์ ์์ด ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ๋ค.
2. ์ ์ฒด ๋ก๊ทธ์ธ ํ๋ก์ธ์ค
์์ ๋ก๊ทธ์ธ ๊ตฌํ์ ์์ ์ ์ฒด์ ์ธ ๋ก๊ทธ์ธ ํ๋ก์ธ์ค๋ฅผ ์ดํด๋ณด์.
- ์ฌ์ฉ์๊ฐ ์นด์นด์ค ๋๋ ๊ตฌ๊ธ ๊ณ์ ์ ์ด์ฉํด ๋ก๊ทธ์ธ ์์ฒญ์ ๋ณด๋ธ๋ค.
- OAuth2 ์ธ์ฆ ๊ณผ์ ์ ๊ฑฐ์ณ ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๋๋ค.
- ์ก์ธ์ค ํ ํฐ์ ์ด์ฉํด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ ๊ท ํ์์ธ์ง ๊ธฐ์กด ํ์์ธ์ง ํ๋ณํ์ฌ ์ฒ๋ฆฌํ๋ค.
- ์ธ์ ์ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฐํํ๋ค.
3. ์นด์นด์ค ๋ก๊ทธ์ธ ๊ตฌํ
3.1 ์นด์นด์ค ๋ก๊ทธ์ธ ์ปจํธ๋กค๋ฌ
@Value("${kakao.client-id}")
private String kakaoClientId;
@Value("${kakao.redirect-uri}")
private String kakaoRedirectUri;
@PostMapping("/login/kakao")
public ResponseEntity<?> kakaoLogin(@RequestParam String code) {
String accessToken = kakaoAuthService.getAccessToken(code);
User user = kakaoAuthService.getUserInfo(accessToken);
return ResponseEntity.ok(user);
}
๐น ์ฝ๋ ์ค๋ช
- @Value ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด API ํค๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌํ๋ค.
- ์ธ์ฆ ์ฝ๋๋ก ์ก์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ์ ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์จ๋ค.
- ์ ๊ท ํ์๊ณผ ๊ธฐ์กด ํ์์ ๊ตฌ๋ถํด ์ฒ๋ฆฌํ๋ ๋ก์ง์ ํฌํจํ๊ณ ์๋ค.
3.2 ์นด์นด์ค API ํธ์ถ ๋ฉ์๋
public String getAccessToken(String code) {
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<string, string=""> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", kakaoClientId);
params.add("redirect_uri", kakaoRedirectUri);
params.add("code", code);
HttpEntity<multivaluemap<string, string="">> request = new HttpEntity<>(params, headers);
ResponseEntity response = restTemplate.postForEntity("https://kauth.kakao.com/oauth/token", request, Map.class);
return response.getBody().get("access_token").toString();
}</multivaluemap<string,></string,>
๐น ์ฝ๋ ์ค๋ช
- RestTemplate์ ํ์ฉํด ์นด์นด์ค API์ ํต์ ํ๋ค.
- ํ ํฐ ์์ฒญ๊ณผ ์ฌ์ฉ์ ์ ๋ณด ์์ฒญ์ ๋ถ๋ฆฌํด ๊ฐ๋ ์ฑ์ ๋์๋ค.
- HTTP ์์ฒญ ํค๋์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ช ํํ๊ฒ ์ค์ ํด API ํธ์ถ ์ค๋ฅ๋ฅผ ์ต์ํํ๋ค.
4. ๊ตฌ๊ธ ๋ก๊ทธ์ธ ๊ตฌํ
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.oauth2Login()
.userInfoEndpoint()
.userService(customOAuth2UserService);
return http.build();
}
๐น ์ฝ๋ ์ค๋ช
- Spring Security OAuth2๋ฅผ ํ์ฉํด ๊ตฌ๊ธ ๋ก๊ทธ์ธ์ ๊ตฌํํ๋ค.
- OAuth2 ์ธ์ฆ์ ์ฒ๋ฆฌํ๋ customOAuth2UserService๋ฅผ ๋ฑ๋กํ๋ค.
- ์ ๊ท ํ์ ๊ฐ์ ์ ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ ํ๊ฒ ์์ฑํ๊ณ ์ํธํํด ์ ์ฅํ๋ค.
5. ํ์ ์ ๋ณด ํตํฉ ๊ด๋ฆฌ
๐น ์ค๊ณ ํฌ์ธํธ
- ์ผ๋ฐ ํ์๊ณผ ์์ ๋ก๊ทธ์ธ ํ์์ ํ๋์ ํ ์ด๋ธ์์ ํตํฉ ๊ด๋ฆฌํ๋ค.
- isSocial ๋ฐ socialType ํ๋๋ฅผ ์ฌ์ฉํด ํ์ ์ ํ์ ๊ตฌ๋ถํ๋ค.
- ์์ ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ํจ๊ป ์ ์ฅํด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํจ๋ค.
6. ๋ณด์ ๊ฐํ๋ฅผ ์ํ ์ธํฐ์ ํฐ
๐น ๋ณด์ ํน์ง
- ๋ก๊ทธ์ธ ์ํ์ ํ์ ์ํ๋ฅผ ์ฒ ์ ํ๊ฒ ๊ฒ์ฆํด ๋ณด์์ ๊ฐํํ๋ค.
- ํ์ ์ํ๋ณ(๋นํ์ฑํ, ์ ์ง, ํํด ๋ฑ) ์ ๊ทผ ์ ์ด๋ฅผ ์ํํ๋ค.
- ์ต์ ํ์ ์ ๋ณด๋ฅผ DB์์ ์กฐํํ์ฌ ์ธ์ ์ ๋ณด์ ๋น๊ตํจ์ผ๋ก์จ ์ธ์ ํ์ด์ฌํน์ ๋ฐฉ์งํ๋ค.
7. ๋ด ๋ก๊ทธ์ธ ์ฝ๋์ ํน๋ณํ ์
โ ์ ์ฐํ ํ์ ๊ด๋ฆฌ
- ์ผ๋ฐ/์์ ํ์์ ํตํฉ ๊ด๋ฆฌํ์ฌ ์ฝ๋ ์ค๋ณต์ ์ต์ํํ๋ค.
- ์๋ก์ด ์์ ๋ก๊ทธ์ธ ์ถ๊ฐ๊ฐ ์ฌ์ด ํ์ฅ์ฑ ์๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ๋ค.
โ ์ฒ ์ ํ ์์ธ ์ฒ๋ฆฌ
- ๋จ๊ณ๋ณ ์์ธํ ์๋ฌ ๋ก๊น ์ผ๋ก ๋ฌธ์ ์ถ์ ์ด ์ฉ์ดํ๋ค.
- ์ฌ์ฉ์ ์นํ์ ์ธ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด UX๋ฅผ ํฅ์์์ผฐ๋ค.
โ ๊ฐ๋ ฅํ ๋ณด์
- ์ธํฐ์ ํฐ๋ฅผ ํ์ฉํ ์ธ๋ฐํ ์ ๊ทผ ์ ์ด๋ก ๋ณด์์ ๊ฐํํ๋ค.
- ํ์ ์ํ์ ๋ฐ๋ฅธ ์ฐจ๋ณํ๋ ์ฒ๋ฆฌ๋ก ์์คํ ์์ ์ฑ์ ๋์๋ค.
- ์์ ๋น๋ฐ๋ฒํธ ์์ฑ ๋ฐ ์ํธํ๋ก ์์ ๊ณ์ ๋ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋ค.
โ ์ต์ ํ๋ ์ฌ์ฉ์ ๊ฒฝํ
- ์์ ํ๋ซํผ์ ํ๋กํ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํด ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์์ผฐ๋ค.
- ์ ๊ท/๊ธฐ์กด ํ์์ ์๋์ผ๋ก ๊ตฌ๋ถํ์ฌ ๋ถํ์ํ ํ์๊ฐ์ ๋จ๊ณ๋ฅผ ์ต์ํํ๋ค.
8. ๋ง๋ฌด๋ฆฌ ๋ฐ ๊ตฌํ ํ
๐น ํ๊ฒฝ ๋ณ์ ํ์ฉ
- API ํค์ ์ํฌ๋ฆฟ์ ๋ฐ๋์ ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
- application.properties ๋๋ ํ๊ฒฝ๋ณ ์ค์ ํ์ผ์์ ๋ถ๋ฆฌํด ์ ์ฅํ๋ฉด ํธ๋ฆฌํ๋ค.
๐น ์์ธ ์ฒ๋ฆฌ์ ์ค์์ฑ
- ์ธ๋ถ API ํธ์ถ์ ํญ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฒ ์ ํ ํด์ผ ํ๋ค.
- ๋ก๊น ์ ํ์ฉํ์ฌ ์ค๋ฅ ์ถ์ ์ด ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ์ข๋ค.
๐น ํ์ ๋ฐ์ดํฐ ์ค๊ณ
- ์์ ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ์ผ๋ฐ ์ฌ์ฉ์๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋ฉด ์ฝ๋๊ฐ ๋จ์ํด์ง๋ค.
- socialType ํ๋๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ์ฌ ์ถํ ํ์ฅ์ฑ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๐น ์ธ์ ๊ด๋ฆฌ
- ์์ ๋ก๊ทธ์ธ ํ ์ธ์ ์ ๋ณด๋ฅผ ์ ์ ํ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ์ธํฐ์ ํฐ๋ฅผ ํ์ฉํ์ฌ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ฒดํฌํ๋ฉด ๋ณด์์ ๊ฐํํ ์ ์๋ค.
์ด๋ฐ ์ ๋ค์ ๊ณ ๋ คํด ๊ตฌํํ๋ฉด ์์ ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์์ ๋ก๊ทธ์ธ ์์คํ ์ ๋ง๋ค ์ ์๋ค.
๋ค์ ํฌ์คํ ์์๋ ํ๋ก ํธ์๋์์ ์์ ๋ก๊ทธ์ธ ๋ฒํผ์ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ๋ค! ๐